在NumPy中复制MATLAB的"randperm"



我想用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.choicenumpy.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()

更新:我也会更新他的答案来标记它。

相关内容

  • 没有找到相关文章

最新更新