coordinates = [(-225.0, -299.5), (-150.0, 75.5), (0.0, 0.0), (225.0, 300.5)]
xy = (-222.4, -204.5)
什么是最好的方法,以便可以将给定值xy与二维坐标列表进行比较,并返回最接近坐标的索引号?
在此示例中,将xy与坐标列表进行比较,从而返回最接近的坐标(-225.0,-299.5),或更理想的是返回索引号0。
我尝试研究使用itertools或numpy的方法,但似乎无法理解如何获得示例中想要的结果。
答案 0 :(得分:2)
您可以将min
与适当的key
功能一起使用。例如,按照以下几行进行操作:
coordinates = [(-225.0, -299.5), (-150.0, 75.5), (0.0, 0.0), (225.0, 300.5)]
xy = (-222.4, -204.5)
dist = lambda x, y: (x[0]-y[0])**2 + (x[1]-y[1])**2
min(coordinates, key=lambda co: dist(co, xy))
# (-225.0, -299.5)
答案 1 :(得分:1)
您的问题等效于:如何使用自定义方法定义排序关键字来对Python列表进行排序。可以在原始python中完成,而无需使用外部库。
使用python的st_makeline(ARRAY[st_startpoint(%s), st_line_interpolate_point(%s, 0.15), st_line_interpolate_point(%s, 0.5), st_line_interpolate_point(%s, 0.85), st_endpoint(%s)])
函数时,您可以将lambda传递给sorted()
参数以对特定键进行排序。
从那里,您只需将键定义为您自己的距离计算方法(此处使用点之间的距离):
key
如果需要更近的点,则可以从那里开始选择列表的第一个元素。如果您仍然想要外部模块,我想您可以使用一些第三方功能,例如from math import *
coordinates = [(-225.0, -299.5), (-150.0, 75.5), (0.0, 0.0), (225.0, 300.5)]
xy = (-222.4, -204.5)
results = sorted(coordinates, key= lambda v: sqrt(pow((v[0] - xy[0]), 2) + pow((v[1] - xy[1]), 2)))
# Output : [(-225.0, -299.5), (-150.0, 75.5), (0.0, 0.0), (225.0, 300.5)]
作为键排序参数。
答案 2 :(得分:0)
您只需创建一个函数即可遍历坐标列表,并保留其中两个点之间的距离最小的索引(使用勾股定理)。
但是,如果您需要由外部模块快速提供的功能而不是编写自己的功能,则我不知道我已经使用的具有该功能的库,因此在这里没有帮助。
答案 3 :(得分:0)
使用scipy.spatial.KDTree:
from scipy import spatial
import numpy as np
coordinates = [(-225.0, -299.5), (-150.0, 75.5), (0.0, 0.0), (225.0, 300.5)]
x = [(-222.4, -204.5)]
distance,index = spatial.KDTree(coordinates).query(x)
print(distance)
print(index)
kd-tree方法为O(N * log(N)),比蛮力法要快得多,后者需要O(N ** 2)时间才能获得足够大的N。