【问题标题】:Python - calculate minimum euclidean distance of two lists of points (coordinates)Python - 计算两个点列表(坐标)的最小欧几里得距离
【发布时间】:2020-06-11 01:35:28
【问题描述】:

我有两个 n 形状的列表,每个点将与第二个列表的每个点进行比较(欧几里得距离),然后选择最小距离,例如:

答:[(1,1),(2,1),(3,1)]

B: [(2,2),(3,3)]

输出将是 3 个距离:

min((1,1) -> (2,2), (1,1) -> (3,3)),

min( (2,1) -> (2,2), (2,1) -> (3,3) ),

分钟 ( (3,1) -> (2,2), (3,1) -> (3,3) )

-> 欧式距离

难点在于编写高效的代码。

【问题讨论】:

    标签: python list numpy distance


    【解决方案1】:

    这是一个可能有帮助的示例代码:

    from scipy.spatial import distance
    
    A = [(1,1),(2,1),(3,1)]
    B = [(2,2),(3,3)]
    
    min_dist = []
    for a in A:
        dist = []
        for b in B:
            dist.append(distance.euclidean(a,b))
        min_dist.append(min(dist))
    
    >> min_dist
    >> [1.4142135623730951, 1.0, 1.4142135623730951]
    

    我为此使用scipy 库。也可以使用numpy.linalg.norm。这种方法对您有用吗?

    HTH。

    【讨论】:

      【解决方案2】:

      找到了一个方法,不知道有没有人可以更高效,

      import numpy as np
      from scipy.spatial import distance
      
      s1 = np.array([(0,0), (0,1), (1,0), (1,1)])
      s2 = np.array([(3,2), (1,9)])
      print(distance.cdist(s1,s2).min(axis=1))
      # array([3.60555128, 3.16227766, 2.82842712, 2.23606798]) 
      

      【讨论】:

        【解决方案3】:

        取决于您所说的“高效”。如果您有相当大的列表并且要进行大量比较,则应该只查找最小平方距离,因为您避免了平方根运算,所以计算起来要快得多。这是处理欧几里德距离时的标准技巧。

        如果最后你想要实际的欧式距离,然后取平方根。

        考虑:

        import numpy as np
        
        A = [(1, 1), (2, 1), (3, 1)]
        B = [(2, 2), (3, 3)]
        
        # compare each point in A to all points in B, return the shortest distance
        
        for pt in A:
            min_sq_dist = min( (pt[0] - t[0])**2 + (pt[1] - t[1])**2 for t in B )
            print(np.sqrt(min_sq_dist))
        

        输出:

        1.4142135623730951
        1.0
        1.4142135623730951
        

        最大的不同是什么?上面的代码计算 3 个平方根。天真的方法计算 6(|{B}| 倍)

        【讨论】:

          猜你喜欢
          • 2021-12-21
          • 2014-10-27
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 1970-01-01
          • 2020-06-10
          相关资源
          最近更新 更多