Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-给定两个元组列表,查找它们之间最接近的元组(dist_Python_Python 2.7_Listview_Tuples_Coordinates - Fatal编程技术网

python-给定两个元组列表,查找它们之间最接近的元组(dist

python-给定两个元组列表,查找它们之间最接近的元组(dist,python,python-2.7,listview,tuples,coordinates,Python,Python 2.7,Listview,Tuples,Coordinates,我有两个带有元组(坐标)的列表,例如: some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)] some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)] 元组中的每个值都是一个平面 列表的长度不同 我不知道如何在两个列表之间找到最近的两个点。我不知道如何找到,也

我有两个带有元组(坐标)的列表,例如:

some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)]
some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)]
  • 元组中的每个值都是一个平面
  • 列表的长度不同

我不知道如何在两个列表之间找到最近的两个点。我不知道如何找到,也许可以使用距离来找到。我希望有一种更有效的方法来实现这一点,因为我需要这个函数尽快工作(这是更大功能的一部分).

在任何情况下,您都需要进行所有可能的组合,有一些算法可以帮助您以最佳顺序进行组合或避免重复距离。如果您想快速进行组合,您应该使用一个特殊的库来帮助编译或预编译数组,这可以通过或完成。其他库(如scipy)也有特殊模块suh as。更多疑问,请查看此帖子

例如:

import scipy.spatial.distance as sd
import numpy as np
some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)]
some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)]
np.unravel_index(np.argmin(sd.cdist(some_pt1, some_pt2)), (len(some_pt1), len(some_pt2)))
结果:
(2,4)

此代码将返回第一个列表和第二个列表中的位置。

按欧几里德距离:

>>> some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)]
>>> some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)]
>>> 
>>> def dist_sq(p1_p2):
...     p1, p2 = p1_p2
...     return sum(x*y for x,y in zip(p1, p2))
... 
>>> 
>>> min(((p1, p2) for p1 in some_pt1 for p2 in some_pt2), key=dist_sq)
((3.24, 4.28), (6.91, 0.56))
它有运行时O(n*m)(其中n,m是列表的长度)。因为您需要查看所有对,所以不会比这更好

请注意,比较平方距离就足够了,无需计算根。

这如何

from pprint import pprint

some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)]
some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)]


distance = {}
for x in some_pt1:
    for y in some_pt2:
        dist =abs(abs(x[0])-abs(y[0]))+abs(abs(x[1])-abs(y[1]))
        distance[dist]=[x,y]

shortest =sorted(distance.keys())[0]
print("Min Distance is {} Objects are  {} {} ".format(shortest, distance[shortest][0],distance[shortest][0]))

或者,通过引用Tim Seed的代码。这可以使用

from scipy.spatial import distance
some_pt1 = [(10.76,2.9),(3.24,4.28),(7.98,1.98),(3.21,9.87)]
some_pt2 = [(11.87,6.87), (67.87,8.88), (44.44, 6.78), (9.81, 1.09), (6.91, 0.56), (8.76, 8.97), (8.21, 71.66)]

empthy_dict = {}
for i in range(len(some_pt1)):
    for j in range(len(some_pt2)):
        dist = distance.euclidean(some_pt1[i],some_pt2[j])
        empthy_dict[dist] = [some_pt1[i],some_pt2[j]]

shortest = sorted(empthy_dict.keys())[0]
points = empthy_dict[shortest]
print('Shortest distance is ' ,shortest,' and points are ' ,points)

这是要求两个点都来自两个列表还是也包括同一列表中的点之间的距离?用什么度量?欧几里德?这是要求每个点都来自不同的列表。欧几里德…这是(几乎太多了
abs
)曼哈顿度量,这是错误的:)谢谢,这看起来可以很好地完成这项工作,但这让我不禁要问:有没有其他方法比检查每一个更有效,因为我将拥有的真正的列表会很长,并且可能有非常远的点。@eranhalperin不,你不能降低算法的复杂性。你可以使用
numpy
和Jorge Rodriguez Molinuevo提到的其他技术使它更快,但是你需要比较每一对。好吧,那么我如何使用numpy(例如)使它更快地工作呢