2016-03-03 88 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])])