假设我有两个分别为A
和B
的数组(n1,m1,m2)
和(n2,m1,m2)
。我想计算尺寸为C
的矩阵(n1,n2)
,使其C[i,j] = sum((A[i,:,:] - B[j,:,:])^2)
。以下是我到目前为止的情况:
import numpy as np
A = np.array(range(1,13)).reshape(3,2,2)
B = np.array(range(1,9)).reshape(2,2,2)
C = np.zeros(shape=(A.shape[0], B.shape[0]) )
for i in range(A.shape[0]):
for j in range(B.shape[0]):
C[i,j] = np.sum(np.square(A[i,:,:] - B[j,:,:]))
C
最有效的方法是什么?在R中,我将使用矢量化方法,例如outer
。 Python有类似的方法吗?
感谢。
答案 0 :(得分:3)
您可以使用scipy's cdist
,这对reshaping
输入数组2D
之后的此类计算非常有效,就像这样 -
from scipy.spatial.distance import cdist
C = cdist(A.reshape(A.shape[0],-1),B.reshape(B.shape[0],-1),'sqeuclidean')
现在,上述方法必须具有内存效率,因此在处理大型数据时更好。对于小型输入数组,还可以使用np.einsum
并利用NumPy broadcasting
,如此 -
diffs = A[:,None]-B
C = np.einsum('ijkl,ijkl->ij',diffs,diffs)