在过大的数组内部进行多重运算和加法

2024-04-28 16:49:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个形状为(M,N)的数组A,现在我想做这个操作

R = (A[:,newaxis,:] * A[newaxis,:,:]).sum(2)

它将生成一个(MxM)数组。现在的问题是数组很大,我得到了一个内存错误,因为MxMxN数组无法放入内存。在

最好的策略是什么? C呢?map()?或者有什么特别的功能吗?在

谢谢你, 大卫


Tags: 内存功能map错误数组策略大卫形状
1条回答
网友
1楼 · 发布于 2024-04-28 16:49:40

我不确定您的阵列有多大,但以下是等效的:

R = np.einsum('ij,kj',A,A)

而且速度更快,内存消耗更少:

^{pr2}$

如果我将A的大小增加到(500,4000)np.einsum将在大约2秒钟内完成计算,而由于必须创建的临时数组的大小,原始公式会使我的计算机停止运行。在

更新

正如@Jaime在评论中指出的,np.dot(A,A.T)也是这个问题的一个等价公式,并且可以比np.einsum解决方案更快。完全归功于他指出了这一点,但万一他没有把它作为正式的解决方案,我想把它拉到主要答案中。在

相关问题 更多 >