【问题标题】:Operations on very large numpy arrays of different dimensions: running waying too slow对不同维度的非常大的 numpy 数组进行操作:运行速度太慢
【发布时间】:2021-07-27 20:07:14
【问题描述】:

假设我有两个数组:

import numpy as np
A = np.random.rand(500,4,200)
B = np.random.rand(100,100)

我想做以下操作(以索引表示法): C_{ijkmn} = A_{ijk} - B_{mn}

这样做的明显方法是

C = A[:,:,:,None,None] - B[None,None,None,:,:] # has shape 500,4,200,100,100

但它使我的内核崩溃并占用太多内存。所以我的问题很简单,我怎样才能更有效地执行这种操作? numba 会有帮助吗?非常感谢!!

【问题讨论】:

  • C 形状需要 32 Gb 的内存。你有吗?
  • @hpaulj 好吧,可能。我可以在本地计算集群上将其作为作业运行
  • 计算集群一般不会在节点之间共享内存。如果您没有足够的内存,操作系统将使用速度较慢的存储设备。即使有足够的内存,计算也将在 CPU 缓存之外执行,并可能导致缓慢的页面错误。这样做效率不高。你为什么要这样做?你真的需要整个C数组吗?
  • 我建议拆分数组并在几个迭代循环中完成该过程。
  • Numba 在这里不会有很大帮助。问题是:你想用这个巨大的 (32Gb) C 阵列做什么?也许这只是一个临时结果,可以完全避免,也可以进行分块计算。

标签: python arrays numpy numba array-broadcasting


【解决方案1】:

Welp,事实证明,这里最好的做法是计算 C 的一些示例并在精细网格上进行插值。这似乎运作良好!只需使用 scipy 函数...

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2014-08-28
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多