【问题标题】:Eucledian distance matrix between two matrices两个矩阵之间的欧氏距离矩阵
【发布时间】:2022-11-21 22:22:14
【问题描述】:

我有以下函数计算 Matrix A 和 Matrix 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 函数以更有效的方式实现这一点。有没有这样的功能或者这样做的矢量化方式是什么?

【问题讨论】:

    标签: python numpy matrix scipy euclidean-distance


    【解决方案1】:

    是的,你可以这样做:

    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/

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多