列表中两点之间的距离公式
我需要从我创建的一个列表中找出最接近的两个点,并把它们打印出来。我该怎么比较列表中的每个点呢?
其实不需要绘图什么的,只要比较这些点,找出列表中最接近的两个就可以了。
import math # 'math' needed for 'sqrt'
# Distance function
def distance(xi,xii,yi,yii):
sq1 = (xi-xii)*(xi-xii)
sq2 = (yi-yii)*(yi-yii)
return math.sqrt(sq1 + sq2)
# Run through input and reorder in [(x, y), (x,y) ...] format
oInput = ["9.5 7.5", "10.2 19.1", "9.7 10.2"] # Original input list (entered by spacing the two points).
mInput = [] # Manipulated list
fList = [] # Final list
for o in oInput:
mInput = o.split()
x,y = float(mInput[0]), float(mInput[1])
fList += [(x, y)] # outputs [(9.5, 7.5), (10.2, 19.1), (9.7, 10.2)]
7 个回答
2
注意,math.sqrt
这个函数既慢又在这种情况下不必要。可以尝试比较平方距离来加快速度(排序距离和排序平方距离的结果总是一样的):
def distSquared(p0, p1):
return (p0[0] - p1[0])**2 + (p0[1] - p1[1])**2
12
我知道这个问题有一些库的限制,但为了完整起见,如果你有N
个点在一个Nx2的numpy ndarray(二维系统)中:
from scipy.spatial.distance import pdist
x = numpy.array([[9.5,7.5],[10.2,19.1],[9.7,10.2]])
mindist = numpy.min(pdist(x))
我总是鼓励大家在处理最好用数字数组存储的数据时使用numpy/scipy,知道这些工具的存在对将来会很有帮助。
35
把你的 distance()
函数改写成接受两个 (x, y)
元组作为参数会更方便:
def distance(p0, p1):
return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2)
现在你想要遍历你列表中的所有点对 fList
。这个时候,iterools.combinations()
函数就很有用:
min_distance = distance(fList[0], fList[1])
for p0, p1 in itertools.combinations(fList, 2):
min_distance = min(min_distance, distance(p0, p1))
另外一种方法是把 distance()
函数定义成只接受一对点作为一个参数
def distance(points):
p0, p1 = points
return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2)
然后使用内置的 min()
函数的 key
参数:
min_pair = min(itertools.combinations(fList, 2), key=distance)
min_distance = distance(min_pair)