簡體   English   中英

兩個矩陣之間的歐幾里德距離矩陣

[英]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.        ]]

我花了一些時間尋找numpyscipy 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.        ]])

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM