【发布时间】: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