亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python - 計算兩個點列表(坐標)的最小歐氏距離

Python - 計算兩個點列表(坐標)的最小歐氏距離

ABOUTYOU 2022-08-11 17:46:15
我有兩個n個形狀的列表,每個點將被比較(歐氏距離)到第二個列表的每個點,然后選擇最小距離,例如:答: [(1,1),(2,1),(3,1)]B: [(2,2),(3,3)]輸出將為 3 個距離:分鐘((1,1) -> (2,2), (1,1) -> (3,3)),分鐘( (2,1) -> (2,2), (2,1) -> (3,3) ),分鐘 ( (3,1) -> (2,2), (3,1) -> (3,3) )->歐氏距離困難的部分是制作有效的代碼。
查看完整描述

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


查看完整回答
反對 回復 2022-08-11
?
陪伴而非守候

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}|倍數)


查看完整回答
反對 回復 2022-08-11
?
Qyouu

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


查看完整回答
反對 回復 2022-08-11
  • 3 回答
  • 0 關注
  • 332 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號