两个矩阵之间的欧氏距离矩阵



我有以下函数,计算矩阵A和矩阵B中向量的所有组合之间的欧氏距离

def distance_matrix(A,B):
n=A.shape[1]
m=B.shape[1]
C=np.zeros((n,m))
for ai, a in enumerate(A.T):
for bi, b in enumerate(B.T): 
C[ai][bi]=np.linalg.norm(a-b)
return C

这工作得很好,并从d*n-矩阵和d*m-矩阵创建一个n*m-矩阵,其中包含列向量的所有组合之间的欧几里德距离。

>>> print(A)
[[-1 -1  1  1  2]
[ 1 -1  2 -1  1]] 
>>> print(B)
[[-2 -1  1  2]
[-1  2  1 -1]]
>>> print(distance_matrix(A,B))
[[2.23606798 1.         2.         3.60555128]
[1.         3.         2.82842712 3.        ]
[4.24264069 2.         1.         3.16227766]
[3.         3.60555128 2.         1.        ]
[4.47213595 3.16227766 1.         2.        ]]

我花了一些时间寻找numpyscipy函数以更有效的方式实现这一点。是否有这样一个函数或者用什么方法来做这个?

您可以使用:

np.linalg.norm(A[:,:,None]-B[:,None,:],axis=0)

或(完全等价但没有内置函数)

((A[:,:,None]-B[:,None,:])**2).sum(axis=0)**0.5

我们需要一个5x4的final数组所以我们这样扩展数组:

A[:,:,None]               -> 2,5,1
↑ ↓ 
B[:,None,:]               -> 2,1,4
A[:,:,None] - B[:,None,:] -> 2,5,4

,我们将sum应用到轴0上,最终得到一个5,4 narray。

是的,你可以广播你的矢量:

A = np.array([[-1, -1,  1,  1,  2], [ 1, -1,  2, -1,  1]])
B = np.array([[-2, -1,  1,  2], [-1,  2,  1, -1]])
C = np.linalg.norm(A.T[:, None, :] - B.T[None, :, :], axis=-1)
print(C)
array([[2.23606798, 1.        , 2.        , 3.60555128],
[1.        , 3.        , 2.82842712, 3.        ],
[4.24264069, 2.        , 1.        , 3.16227766],
[3.        , 3.60555128, 2.        , 1.        ],
[4.47213595, 3.16227766, 1.        , 2.        ]])

你可以在这里得到它是如何工作的解释:

https://sparrow.dev/pairwise-distance-in-numpy/

最新更新