3 回答

TA貢獻1846條經驗 獲得超7個贊
下面是一個可能有幫助的示例代碼:
from scipy.spatial import distance
A = [(1,1),(2,1),(3,1)]
B = [(2,2),(3,3)]
min_dist = []
for a in A:
dist = []
for b in B:
dist.append(distance.euclidean(a,b))
min_dist.append(min(dist))
>> min_dist
>> [1.4142135623730951, 1.0, 1.4142135623730951]
我正在為此使用庫。也可以使用 .這種方法適合您嗎?scipynumpy.linalg.norm

TA貢獻1757條經驗 獲得超8個贊
這取決于你所說的“高效”是什么意思。如果你有相當大的列表,并且你要做很多比較,你應該只尋找最小平方距離,這計算起來要快得多,因為你避免了平方根運算。這是處理歐氏距離時的標準技巧。
如果最后,你想要實際的歐氏距離,那么取平方根。
考慮:
import numpy as np
A = [(1, 1), (2, 1), (3, 1)]
B = [(2, 2), (3, 3)]
# compare each point in A to all points in B, return the shortest distance
for pt in A:
min_sq_dist = min( (pt[0] - t[0])**2 + (pt[1] - t[1])**2 for t in B )
print(np.sqrt(min_sq_dist))
輸出:
1.4142135623730951
1.0
1.4142135623730951
最大的區別是什么?上面的代碼計算 3 個平方根。樸素方法計算 6 (|{B}|倍數)

TA貢獻1786條經驗 獲得超11個贊
我找到了一種方法,我不知道是否有人能更有效地做到這一點,
import numpy as np
from scipy.spatial import distance
s1 = np.array([(0,0), (0,1), (1,0), (1,1)])
s2 = np.array([(3,2), (1,9)])
print(distance.cdist(s1,s2).min(axis=1))
# array([3.60555128, 3.16227766, 2.82842712, 2.23606798])
添加回答
舉報