在NumPy中复制MatLab的“Randperm”

px9o7tmv  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(157)

我想用NumPy复制MatLab的randperm()
目前,要获得randperm(n, k),我使用np.random.permutation(n)[:k]。问题是它分配了一个大小为n的数组,然后只有k个条目。
有没有更高效的内存直接创建数组的方法?

vxqlmq5t

vxqlmq5t1#

基于@TaQ的答案:

np.random.choice(n, k, replace = False)

等同于MatLab的randperm()
更新:我也会更新他的答案来标记它。

2o7dmzc5

2o7dmzc52#

我可以推荐你np.random.choice(n, k, replace = False)。然而,我不确定内存效率。请参考docs

qzwqbdag

qzwqbdag3#

numpy.random.choice(n, k, replace=False)的内存效率并不比numpy.random.permutation(n)[:k]高。它也会创建一个包含n项的临时列表,对该列表进行置乱,并从该列表中获取k项。请参见:

然而,从NumPy 1.17开始,numpy.random.*函数(如numpy.random.choicenumpy.random.permutation)已成为遗留函数,出于向后兼容的原因,它们的算法-效率低下和全部-预计将保持不变(请参见最近的RNG policy for NumPy)。
幸运的是,从1.17版开始,NumPy有一个替代方案:numpy.random.Generator.choice,它使用了更高效的实现,如下所示:

In [227]: timeit np.random.choice(4000000, 48, replace = False)                                  
163 ms ± 19.3 ms per loop (mean ± std. Dev. Of 7 runs, 1 loop each)

In [228]: timeit np.random.permutation(4000000)[:48]                                             
178 ms ± 22.5 ms per loop (mean ± std. Dev. Of 7 runs, 1 loop each)

In [229]: r=numpy.random.default_rng()                                                           

In [230]: timeit r.choice(4000000,48,replace=False)                                              
14.5 µs ± 28.9 ns per loop (mean ± std. Dev. Of 7 runs, 100000 loops each)

如果您使用的是NumPy 1.17或更高版本,则应该在较新的应用程序中使用1.17版中引入的新的伪随机数生成系统,包括numpy.random.Generator

相关问题