2024-04-28 16:49:40 发布
网友
我有一个形状为(M,N)的数组A,现在我想做这个操作
R = (A[:,newaxis,:] * A[newaxis,:,:]).sum(2)
它将生成一个(MxM)数组。现在的问题是数组很大,我得到了一个内存错误,因为MxMxN数组无法放入内存。在
最好的策略是什么? C呢?map()?或者有什么特别的功能吗?在
谢谢你, 大卫
我不确定您的阵列有多大,但以下是等效的:
R = np.einsum('ij,kj',A,A)
而且速度更快,内存消耗更少:
如果我将A的大小增加到(500,4000),np.einsum将在大约2秒钟内完成计算,而由于必须创建的临时数组的大小,原始公式会使我的计算机停止运行。在
A
(500,4000)
np.einsum
更新:
正如@Jaime在评论中指出的,np.dot(A,A.T)也是这个问题的一个等价公式,并且可以比np.einsum解决方案更快。完全归功于他指出了这一点,但万一他没有把它作为正式的解决方案,我想把它拉到主要答案中。在
np.dot(A,A.T)
我不确定您的阵列有多大,但以下是等效的:
而且速度更快,内存消耗更少:
^{pr2}$如果我将
A
的大小增加到(500,4000)
,np.einsum
将在大约2秒钟内完成计算,而由于必须创建的临时数组的大小,原始公式会使我的计算机停止运行。在更新:
正如@Jaime在评论中指出的,
np.dot(A,A.T)
也是这个问题的一个等价公式,并且可以比np.einsum
解决方案更快。完全归功于他指出了这一点,但万一他没有把它作为正式的解决方案,我想把它拉到主要答案中。在相关问题 更多 >
编程相关推荐