两个numpy数组之间的元素欧氏距离

两个numpy数组之间的元素欧氏距离,numpy,numpy-ndarray,array-broadcasting,Numpy,Numpy Ndarray,Array Broadcasting,我有两个Numpy数组,每个数组有n行: a = [[X1a, Y1a], [X2a, Y2a], .. , [Xna, Yna]] b = [[X1b, Y1b], [X2b, Y2b], .. , [Xnb, Ynb]] 我怎样才能得到一个新的表,表中每个对应行的欧几里德距离 c = [dis(1a, 1b), dis(2a, 2b), .. , dis(na, nb)] 或许 c = [[dis(1a, 1b)], [dis(2a, 2b)], .. , [dis(na, nb)]]

我有两个Numpy数组,每个数组有n行:

a = [[X1a, Y1a], [X2a, Y2a], .. , [Xna, Yna]]
b = [[X1b, Y1b], [X2b, Y2b], .. , [Xnb, Ynb]]
我怎样才能得到一个新的表,表中每个对应行的欧几里德距离

c = [dis(1a, 1b), dis(2a, 2b), .. , dis(na, nb)]
或许

c = [[dis(1a, 1b)], [dis(2a, 2b)], .. , [dis(na, nb)]]
这会奏效的。 a、 形状[0]将给出n的值

输入

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.array([[2, 1], [1, 2], [3, 4]])
你会得到

c = [1.4142135623730951, 2.8284271247461903, 2.8284271247461903]

我发现矢量化更具python风格,速度更快:

a = np.array(a)
b = np.array(b)
np.sqrt(np.sum((a-b)**2,axis=1))

有大量使用scipy的cdist、pdist或numpy的einsum计算距离的示例。它们也可以扩展到多个维度

from scipy.spatial.distance import cdist
a = np.array([[1., 2], [3, 4], [5, 6]])
b = np.array([[2, 1], [1, 2], [3, 4]])
cdist(a, b)
Out[14]: 
array([[  1.414,   0.000,   2.828],
       [  3.162,   2.828,   0.000],
       [  5.831,   5.657,   2.828]])


欧几里得距离也称为2范数
numpy.linalg.norm
将跨向量高效地计算此值:

import numpy.linalg as la

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.array([[2, 1], [1, 2], [3, 4]])

c = la.norm(a - b, axis=1)
a = np.array([[1., 2], [3, 4], [5, 6]])
b = np.array([[2, 1], [1, 2], [3, 4]])
b = b[:, np.newaxis]
diff = a - b
np.sqrt(np.einsum('ijk,ijk->ij', diff, diff))
array([[  1.414,   3.162,   5.831],
       [  0.000,   2.828,   5.657],
       [  2.828,   0.000,   2.828]])
import numpy.linalg as la

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.array([[2, 1], [1, 2], [3, 4]])

c = la.norm(a - b, axis=1)