[英]Eucledian distance matrix between two matrices
我有以下 function 計算矩陣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
-Matrix 和d*m
-Matrix 創建了一個n*m
-Matrix,其中包含列向量的所有組合之間的歐幾里得距離。
>>> 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. ]]
我花了一些時間尋找numpy
或scipy
function 以更有效的方式實現這一目標。 是否有這樣的 function 或執行此操作的矢量化方法是什么?
您可以使用:
np.linalg.norm(A[:,:,None]-B[:,None,:],axis=0)
或(完全等效但沒有內置功能)
((A[:,:,None]-B[:,None,:])**2).sum(axis=0)**0.5
我們需要一個 5x4 的最終數組,所以我們以這種方式擴展我們的數組:
A[:,:,None] -> 2,5,1
↑ ↓
B[:,None,:] -> 2,1,4
A[:,:,None] - B[:,None,:] -> 2,5,4
然后我們在軸 0 上應用我們的sum
,最終得到一個 5,4 ndarray。
是的,你可以廣播你的載體:
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. ]])
你可以在這里得到它是如何工作的解釋:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.