为什么赋值操作仍然为Python中的大型数组提供MemoryError?

时间:2018-01-05 15:33:11

标签: python numpy

我有一个大数组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的替代解决方案。

1 个答案:

答案 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.]]

两次。