列表中两点之间的距离公式

20 投票
7 回答
95449 浏览
提问于 2025-04-16 14:16

我需要从我创建的一个列表中找出最接近的两个点,并把它们打印出来。我该怎么比较列表中的每个点呢?

其实不需要绘图什么的,只要比较这些点,找出列表中最接近的两个就可以了。

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)

撰写回答