我有问题。我想在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中给出的坐标。 我的英语不是那么好,所以如果你不理解我的问题,请说出来,我会尝试以某种方式解释。
答案 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])