求和2个Numpy数组之间的平方差

时间:2016-06-07 19:48:44

标签: python numpy

假设我有以下2个数组:

import numpy as np
a=np.asarray([[1,2,4],
       [3,1,2]])
b=np.asarray([[2,1,1],
       [3,2,3],
       [4,1,2],
       [2,2,1],])

对于a中的每一行a_row,我想得到a_row和b中每一行之间的平方差的总和。结果数组将是一个2乘4的数组。预期结果如下:

array([[ 11.,   5.,  14.,  10.],
       [  2.,   2.,   1.,   3.]])

我已经使用循环实现了解决方案:

c=np.zeros((2,4))
for e in range(a.shape[0]):
    c[e,:] = np.sum(np.square(b-a[e,:]),axis=1)
print c

我需要的是一个完全矢量化的解决方案,即不需要循环。

2 个答案:

答案 0 :(得分:3)

如果你有权访问scipy,那么你可以这样做:

import scipy
from scipy.spatial.distance import cdist

import numpy as np

a=np.asarray([[1,2,4],
       [3,1,2]])
b=np.asarray([[2,1,1],
       [3,2,3],
       [4,1,2],
       [2,2,1],])

x = cdist(a,b)**2
# print x
# array([[ 11.,   5.,  14.,  10.],
#        [  2.,   2.,   1.,   3.]])

这使用了矢量化且快速的cdist函数。您可以使用numba或cython获得更快的速度,但这取决于实际阵列的大小。

答案 1 :(得分:3)

这是一种Numpythonic方法,只需重新整形b,以便能够直接从中减去a

>>> np.square(b[:,None] - a).sum(axis=2).T
array([[11,  5, 14, 10],
       [ 2,  2,  1,  3]])