用numpy广播计算距离矩阵的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用numpy广播计算距离矩阵的方法相关的知识,希望对你有一定的参考价值。

我想计算(x,y,z)坐标的欧几里得距离矩阵.我找到了计算(x,y)坐标的欧几里得距离矩阵的方法。

def euclidian_dist(x,y):
    diff = np.expand_dims(x, axis=1) - np.expand_dims(y, axis=0)
    distance_matrix = np.sqrt(np.sum(diff ** 2, axis=-1))
    return distance_matrix

if __name__=="__main__":
    #[[x1,y1],[x2,y2],...,[xn,yn]]
    p = np.array([[0.0, 0.0],[1., 0],[1, 1],[0, 1]])
    q = np.array([[0., 0],[1., 0],[0.3, 0.4],[0.7, 0.6]])
    euclidian_dist(p,q)

ans: array([[0.        , 1.        , 0.5       , 0.92195445],
            [1.        , 0.        , 0.80622577, 0.67082039],
            [1.41421356, 1.        , 0.92195445, 0.5       ],
            [1.        , 1.41421356, 0.67082039, 0.80622577]])

下一步,我想用x,y,z坐标([[x1,y1,z1],[x2,y2,z2],...,[xn,yn,zn]])

并想得到欧几里得距离矩阵( shape:n✕n)。

如果你知道解决方法,可以告诉我吗?

答案

对3D点使用相同的代码。它工作得很好。

def euclidian_dist(x,y):
    diff = np.expand_dims(x, axis=1) - np.expand_dims(y, axis=0)
    distance_matrix = np.sqrt(np.sum(diff ** 2, axis=-1))
    return distance_matrix

if __name__=="__main__":
    #[[x1,y1],[x2,y2],...,[xn,yn]]
    p = np.array([[0.0, 0.0, 0.0],[1.,1., 0],[1, 1, 1],[0, 0, 1]])
    q = np.array([[0., 0, 0],[1.,1., 0],[0.3,0.3, 0.4],[0.7, 0.6, 0.6]])
    print(euclidian_dist(p,q))

输出:

[[0.         1.41421356 0.58309519 1.1       ]
 [1.41421356 0.         1.06770783 0.78102497]
 [1.73205081 1.         1.15758369 0.64031242]
 [1.         1.73205081 0.73484692 1.00498756]]

以上是关于用numpy广播计算距离矩阵的方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥 np.hypot 和 np.subtract.outer 与香草广播相比非常快?使用 Numba 并行加速 numpy 进行距离矩阵计算

AI常用框架和工具丨1. 科学计算库NumPy

AI常用框架和工具丨1. 科学计算库NumPy

NumPy之:理解广播

广播类似于 Numpy 的犰狳矩阵运算的最佳方式

NumPy之计算两个矩阵的成对平方欧氏距离