两个numpy数组之间的元素欧氏距离
我有两个Numpy数组,每个数组有n行:两个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)]]
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)