一个点和一组其他点之间的最短距离?

时间:2014-12-11 16:50:35

标签: python function

我有问题。我想在python中编写一个函数,它将接收坐标X和一组坐标S.我需要将最近的坐标返回到组s的x。所以当你调用一个函数时,它会返回:

closest((9, 2), {(0, 0), (10, 0), (10, 10)}) # calling a function
(10, 0) 

因为它最接近两个点。 我已经有一个计算两点之间距离的函数

def distance(s,t):
    v = 0
    for i in range(len(t)):
        v = v+(s[i]-t[i])**2
    return (sqrt(v))

但现在我仍然坚持如何将最接近的坐标元组返回到x中给出的坐标。 我的英语不是那么好,所以如果你不理解我的问题,请说出来,我会尝试以某种方式解释。

2 个答案:

答案 0 :(得分:5)

首先,您可以创建一个仅返回两点之间距离的distance函数

import math
def distance(p1, p2):
    return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)

然后closest可以使用带有min参数的key函数,将distance函数用于others

中的每个元素
def closest(pt, others):
    return min(others, key = lambda i: distance(pt, i))

实施例

>>> closest((9, 2), {(0, 0), (10, 0), (10, 10)})
(10, 0)

计算平均距离

def avgDistance(pt, others):
    dists = [distance(pt, i) for i in others]
    return sum(dists) / len(dists)

>>> avgDistance((9, 2), {(0, 0), (10, 0), (10, 10)})
6.505956727697075

答案 1 :(得分:4)

不要重新发明轮子。这个功能存在于python的科学库(scipy)中,如果您要对数据执行更多的数学运算,您应该真正开始使用这些库,因为它们比执行它们快得多使用常规python,因为代码是矢量化,并且通常是优化的C / fortran库的薄包装。

>>> import numpy as np
>>> from scipy.spatial.distance import cdist
>>> a = np.array([[9, 2]])
>>> others = np.array([[0, 0], [10, 0], [10, 10]])
>>> def closest_point(pt, others):
...     distances = cdist(pt, others)
...     return others[distances.argmin()]
... 
>>> closest_point(a, others)
array([10,  0])

计算到那一点的所有距离的平均距离:

>>> distances = cdist(a, others)
>>> distances
array([[ 9.21954446,  2.23606798,  8.06225775]])
>>> distances.mean()
6.5059567276970753

最后,为了找到最中心的点#34;在它与所有其他节点的平均距离最小的意义上,你必须计算所有节点之间的距离:

>>> all_nodes = np.array([[0,0], [10,0], [0,10], [10, 10], [5,4]])
>>> from scipy.spatial.distance import pdist, squareform
>>> avg_dists = squareform(pdist(all_nodes)).mean(axis=1)
>>> avg_dists
array([ 8.10905197,  8.10905197,  8.39047706,  8.39047706,  5.68534957])
>>> all_nodes[avg_dists.argmin()]
array([5, 4])