【问题标题】:Element-wise Euclidian distances between 2 numpy arrays2个numpy数组之间的元素欧几里得距离
【发布时间】:2021-04-06 17:03:28
【问题描述】:

我有两个 Numpy 数组,每个数组有 n 行:

a = [[X1a, Y1a], [X2a, Y2a], .. , [Xna, Yna]]
b = [[X1b, Y1b], [X2b, Y2b], .. , [Xnb, Ynb]]

如何获得每个对应行的欧几里得距离的新表?

c = [dis(1a, 1b), dis(2a, 2b), .. , dis(na, nb)]

或许

c = [[dis(1a, 1b)], [dis(2a, 2b)], .. , [dis(na, nb)]]

【问题讨论】:

    标签: numpy numpy-ndarray array-broadcasting


    【解决方案1】:
    c = []
    for i in range(a.shape[0]):
    c.append(math.sqrt( (a[i][0]-b[i][0])**2 + (a[i][1] - b[i][1])**2))
    

    这会奏效。 a.shape[0] 将给出 n

    的值

    对于输入

    a = np.array([[1, 2], [3, 4], [5, 6]])
    b = np.array([[2, 1], [1, 2], [3, 4]])
    

    你会得到

    c = [1.4142135623730951, 2.8284271247461903, 2.8284271247461903]
    

    【讨论】:

      【解决方案2】:

      我发现矢量化更符合 Python 风格且速度更快:

      a = np.array(a)
      b = np.array(b)
      np.sqrt(np.sum((a-b)**2,axis=1))
      

      【讨论】:

        【解决方案3】:

        有很多使用 scipy 的 cdist、pdist 或 numpy 的 einsum 来计算距离的示例。它们也可以扩展到多个维度。

        from scipy.spatial.distance import cdist
        a = np.array([[1., 2], [3, 4], [5, 6]])
        b = np.array([[2, 1], [1, 2], [3, 4]])
        cdist(a, b)
        Out[14]: 
        array([[  1.414,   0.000,   2.828],
               [  3.162,   2.828,   0.000],
               [  5.831,   5.657,   2.828]])
        

        a = np.array([[1., 2], [3, 4], [5, 6]])
        b = np.array([[2, 1], [1, 2], [3, 4]])
        b = b[:, np.newaxis]
        diff = a - b
        np.sqrt(np.einsum('ijk,ijk->ij', diff, diff))
        array([[  1.414,   3.162,   5.831],
               [  0.000,   2.828,   5.657],
               [  2.828,   0.000,   2.828]])
        

        【讨论】:

          【解决方案4】:

          欧几里得距离也称为 2 范数。 numpy.linalg.norm 将有效地计算你的向量:

          import numpy.linalg as la
          
          a = np.array([[1, 2], [3, 4], [5, 6]])
          b = np.array([[2, 1], [1, 2], [3, 4]])
          
          c = la.norm(a - b, axis=1)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-15
            • 2017-03-12
            • 2011-01-29
            • 2021-09-15
            • 2016-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多