python:找到两个数组中两点之间的最小距离

时间:2016-03-03 09:24:12

标签: python arrays list distance

我有两个包含一系列元组(x,y)的列表,代表笛卡尔平面上的不同点:

a = [(0, 0), (1, 2), (1, 3), (2, 4)]
b = [(3, 4), (4, 1), (5, 3)]

我希望在较小的距离找到两个点(每个列表一个,不在同一个列表中),在这种特殊情况下:

[((2, 4), (3, 4))]

其距离等于1.我使用列表理解,如:

[(Pa, Pb) for Pa in a for Pb in b \
if math.sqrt(math.pow(Pa[0]-Pb[0],2) + math.pow(Pa[1]-Pb[1],2)) <= 2.0]

但这会使用阈值。有没有办法在某处或类似的地方附加argmin()并且只获得[((xa, ya), (xb, yb))]对最小距离?感谢。

4 个答案:

答案 0 :(得分:1)

只需使用list comprehension和min,如下所示:

dist = [(Pa, Pb, math.sqrt(math.pow(Pa[0]-Pb[0],2) + math.pow(Pa[1]-Pb[1],2)))
        for Pa in a for Pb in b]

print min(dist, key=lambda x:x[2])[0:2]

答案 1 :(得分:1)

import numpy
e = [(Pa, Pb) for Pa in a for Pb in b]
e[numpy.argmin([math.sqrt(math.pow(Pa[0]-Pb[0],2) + math.pow(Pa[1]-Pb[1],2)) for (Pa, Pb) in e])]

按照你的建议使用argmin并返回((2,4),(3,4))

答案 2 :(得分:1)

类似于DevShark的解决方案,其中包含一些优化技巧:

import math
import itertools
import numpy as np

def distance(p1, p2):
    return math.hypot(p2[0] - p1[0], p2[1] - p1[1])

a = [(0, 0), (1, 2), (1, 3), (2, 4)]
b = [(3, 4), (4, 1), (5, 3)]

points = [tup for tup in itertools.product(a, b)]

print(points[np.argmin([distance(Pa, Pb) for (Pa, Pb) in points])])

答案 3 :(得分:0)

您还可以将scipy.spatial库与以下内容一起使用:

import scipy.spatial as spspat
import numpy as np
distanceMatrix = spspat.distance_matrix(a,b)
args = np.argwhere(distanceMatrix==distanceMatrix.min())
print(args)

这将为您返回以下内容:array([[3, 0]]),即每个列表中点的位置。 这也应该在任何维度上起作用。