2016-03-03 86 views
1

我有包含一系列元组(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))]?谢谢。

+0

你可以创建它们之间的对和距离字典...然后你可以选择对有最小dist –

回答

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))

+0

'NameError:name'numpy'is not defined',通过调用'np.argmin'来修复它。 – mvelay

+0

是的,这很好地工作。谢谢 – urgeo

+0

修正了,谢谢。 – DevShark

1

只需使用列表理解和分如下:

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

相似解以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])])