Python 在这种情况下,绕过“MemoryError”的最佳方式是什么?

Python 在这种情况下,绕过“MemoryError”的最佳方式是什么?,python,arrays,numpy,memory,numexpr,Python,Arrays,Numpy,Memory,Numexpr,我有两个相当大的numpy数组。第一个是尺寸(40,40,3580)的arr1,第二个是尺寸(3580,50)的arr2。我想要达到的是 arr_final = np.sum(arr1[..., None]*arr2, axis = 2) 这样,arr\u final的大小正好是(40,40,50)。然而,在执行上述操作时,python可能会缓存内部数组操作,因此我会不断得到内存错误。是否有任何方法可以避免内部缓存而只得到最终结果?我已经看过了numexpr,但我不确定如何才能在numexpr

我有两个相当大的
numpy
数组。第一个是尺寸
(40,40,3580)
arr1
,第二个是尺寸
(3580,50)
arr2
。我想要达到的是

arr_final = np.sum(arr1[..., None]*arr2, axis = 2)

这样,
arr\u final
的大小正好是
(40,40,50)
。然而,在执行上述操作时,python可能会缓存内部数组操作,因此我会不断得到内存错误。是否有任何方法可以避免内部缓存而只得到最终结果?我已经看过了
numexpr
,但我不确定如何才能在
numexpr
中实现
arr1[…,None]*arr2
,然后在
axis=2上实现
sum
。如有任何帮助或建议,将不胜感激

假设你的意思是
np.sum(arr1[…,None]*arr2,axis=2)
,用
代替
,那么这就是

arr3 = arr1.dot(arr2)
这应该比显式具体化
arr1[…,None]*arr2
更有效,但我不知道它到底分配了什么中间产物

arr3 = numpy.einsum('ijk,kl', arr1, arr2)
您还可以使用
einsum
表示计算。同样,这应该比显式具体化
arr1[…,None]*arr2更有效,但我不知道它具体分配了什么

arr3 = numpy.einsum('ijk,kl', arr1, arr2)

您正在广播一个(40,403580,1)对(1,13580,50),生成(40,403580,50)阵列。然后求和,将其减少到(40,40,50)。但你仍然必须有备用的大中间值。您可以尝试迭代大小为50的维度。大任务上的50个循环在时间上应该是可以的。这个临时数组很大,但应该像2GB大,而不是
MemoryError
big。除非您的数据类型是
object
(在这种情况下:不要这样做),或者您正在使用32位Python(dittp),或者您在嵌入式平台上(好的,这是个问题)。它仍然值得尝试优化,但也值得尝试找出内存不足的原因。这种情况看起来只是
dot
arr1[:,None]*arr2
实际上不起作用。你是说
arr1[…,None]*arr2
?@user2357112是的它是
arr1[…,None]*arr2
。哇,这太棒了!我认为在这种情况下,内存分配是非常有效的。