我有一个大数组K
(29000 x 29000):
K= numpy.random.random((29000, 29000))
我想在K上应用以下操作:
output = K* (1.5 - 0.5 * K* K)
尝试阻止' MemoryError
' ,我按照thread的答案建议进行计算。
但是,当我尝试按如下方式对大型数组进行赋值操作时,我仍然得到MemoryError
:
K *= 1.5 - 0.5 * K * K
欢迎任何帮助。
注意:这不是重复的帖子。使用cython对此post有一个建议。但我正在寻找可能不依赖于Cython的替代解决方案。
答案 0 :(得分:5)
你可以用1000行的块进行赋值。这个创建的附加数组将是数组大小的1/29,并且运行29次的for循环不应该是速度问题。典型的内存/速度权衡。
block = 1000 # the size of row blocks to use
K = np.random.random((29000, 29000))
for i in range(int(np.ceil(K.shape[0] / block))):
K[i*block:(i+1)*block, :] *= 1.5 - 0.5 * K[i*block:(i+1)*block, :]**2
由于对较小矩阵的性能存在一些担忧,因此这里有一个测试:
block = 1000
K = np.arange(9).astype(np.float).reshape((3, 3))
print(1.5 * K - 0.5 * K**3)
for i in range(int(np.ceil(K.shape[0] / block))):
K[i*block:(i+1)*block_size, :] *= 1.5 - 0.5 * K[i*block:(i+1)*block_size, :]**2
print(K)
打印
[[ 0. 1. -1.]
[ -9. -26. -55.]
[ -99. -161. -244.]]
两次。