我想用NumPy复制MATLAB的randperm()
。
目前,为了获得randperm(n, k)
,我使用np.random.permutation(n)[:k]
。问题是它分配了一个大小为n
的数组,然后只获取其中的k
个条目
有没有一种更有效的方法可以直接创建数组?
numpy.random.choice(n, k, replace=False)
的内存效率并不比numpy.random.permutation(n)[:k]
高。它还创建了一个n
项的临时列表,打乱该列表,并从该列表中获取k
项。参见:
- 无替换样本的np.random.choice与np.random shuffle的比较
然而,numpy.random.*
函数,如numpy.random.choice
和numpy.random.permutation
,自NumPy 1.17起已成为遗留函数,由于向后兼容性的原因,它们的算法——效率低下等等——预计将保持原样(请参阅最近针对NumPy的RNG策略(。
幸运的是,自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
。
我可以向您推荐np.random.choice(n, k, replace = False)
。然而,我不确定记忆的效率。请参阅文件
基于@TaQ答案:
np.random.choice(n, k, replace = False)
相当于MATLAB的randperm()
。
更新:我也会更新他的答案来标记它。