获取二维数组中最接近的坐标

时间:2018-11-12 07:32:38

标签: python list multidimensional-array coordinates itertools

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的方法,但似乎无法理解如何获得示例中想要的结果。

4 个答案:

答案 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。