numpy - 计算沿第一轴的两个数组之间的“元素方向”差异

时间:2016-05-05 16:56:38

标签: python arrays performance numpy vectorization

假设我有两个分别为AB的数组(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有类似的方法吗?

感谢。

1 个答案:

答案 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)