【问题标题】:Replicating MATLAB's `randperm` in NumPy在 NumPy 中复制 MATLAB 的 `randperm`
【发布时间】:2022-08-08 06:15:48
【问题描述】:

我想用 NumPy 复制 MATLAB 的 randperm()

目前,要获得randperm(n, k),我使用np.random.permutation(n)[:k]。问题是它分配了一个大小为n 的数组,然后只占用它的k 条目。

是否有更高效的内存方式来直接创建数组?

标签: python numpy performance matlab random


【解决方案1】:

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

【讨论】:

  • 我添加了replace = False,这是复制 MATLAB 行为的必要条件。感谢你的回答。
【解决方案2】:

numpy.random.choice(n, k, replace=False) 的内存效率并不比 numpy.random.permutation(n)[:k] 高。它也创建了一个n-item 临时列表,对该列表进行洗牌,并从该列表中获取k 项目。看:

然而,numpy.random.* 函数,例如 numpy.random.choicenumpy.random.permutation,已经成为 NumPy 1.17 的遗留函数,并且由于向后兼容的原因,它们的算法——效率低下等等——预计将保持原样(参见最近的 @ 987654322@)。

幸运的是,NumPy 从 1.17 版本开始有一个替代方案: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

【讨论】:

  • 还有机会进行内存消耗分析吗?
  • 我不知道如何分析 Python 代码的内存消耗,至少不像时间消耗那么容易。
【解决方案3】:

基于@TaQ 答案:

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

相当于 MATLAB 的randperm()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2018-11-05
    相关资源
    最近更新 更多