在这种情况下,绕过“MemoryError”的最佳方法是什么?
What could be the best way to bypass `MemoryError` in this case?
我有两个 numpy
大小相当大的数组。第一个是大小 (40, 40, 3580)
的 arr1
,第二个是大小 (3580, 50)
的 arr2
。我想要实现的是
arr_final = np.sum(arr1[..., None]*arr2, axis = 2)
使得 arr_final
的大小正好是 (40, 40, 50)
。但是,在执行上述操作时,python 可能会缓存内部数组操作,因此我不断出现内存错误。有什么办法可以避免内部缓存并获得最终结果吗?我看过 numexpr
,但我不确定如何在 numexpr
中实现 arr1[..., None]*arr2
,然后 sum
而不是 axis=2
。任何帮助或建议将不胜感激。
假设您的意思是 np.sum(arr1[..., None]*arr2, axis = 2)
,用 ...
而不是 :
,那么就是 dot
:
arr3 = arr1.dot(arr2)
这应该比显式具体化 arr1[..., None]*arr2
更有效,但我不确切知道它分配了哪些中间体。
你也可以用einsum
来表示计算。同样,这应该比显式具体化 arr1[..., None]*arr2
更有效,但我不知道它到底分配了什么。
arr3 = numpy.einsum('ijk,kl', arr1, arr2)
我有两个 numpy
大小相当大的数组。第一个是大小 (40, 40, 3580)
的 arr1
,第二个是大小 (3580, 50)
的 arr2
。我想要实现的是
arr_final = np.sum(arr1[..., None]*arr2, axis = 2)
使得 arr_final
的大小正好是 (40, 40, 50)
。但是,在执行上述操作时,python 可能会缓存内部数组操作,因此我不断出现内存错误。有什么办法可以避免内部缓存并获得最终结果吗?我看过 numexpr
,但我不确定如何在 numexpr
中实现 arr1[..., None]*arr2
,然后 sum
而不是 axis=2
。任何帮助或建议将不胜感激。
假设您的意思是 np.sum(arr1[..., None]*arr2, axis = 2)
,用 ...
而不是 :
,那么就是 dot
:
arr3 = arr1.dot(arr2)
这应该比显式具体化 arr1[..., None]*arr2
更有效,但我不确切知道它分配了哪些中间体。
你也可以用einsum
来表示计算。同样,这应该比显式具体化 arr1[..., None]*arr2
更有效,但我不知道它到底分配了什么。
arr3 = numpy.einsum('ijk,kl', arr1, arr2)