[英]efficient way to map values between two lists in python
我有兩個清單。 第一個列表是坐標對列表
[[x1, y1]
[x2, y2]
...
[xn, yn]]
第二個列表是坐標對列表以及與每個對相關聯的值
[[x1',y1',v1']
[x2',y2',v2']
...
[xn',yn',vn']]
我想在第二個列表中為第一個列表中的每個對(x,y)找到最接近的(x',y'),然后將值v'映射到(x,y)。
我當前的解決方案是遍歷兩個列表並計算每個可能的坐標對之間的歐幾里得距離,並映射到最小距離。 但是原始的第二個列表有300萬個條目! 有沒有更有效的方法來實現這一目標? 謝謝。
嘗試舍入第二個列表中的坐標。 如果有坐標,那會給你很多小簇。 將四舍五入的坐標用作字典中的鍵,將坐標+值列表作為值。
for x,y in first_list:
x_,y_ = round(x,y)
l = d[(x_,y_)]
... find closest point in l...
使用此算法,您只需要檢查幾點即可。
如果列表為空,則可以使用更寬松的舍入重試。
您可以創建空間地圖,將“區域”映射到該區域中第二個列表中的點,例如,可以將x-min,x-max,y-min,y-max的4個元組映射到點,像這樣:
{(0, 10, 0, 10): [(2, 4, 5), (5, 1, 12), ...], (0, 10, 10, 20): [(4, 14, -1), ...] }
現在,您可以從第一個列表中選擇點的相應區域,例如,如果該點是(24, 13)
,則選擇與區域(20, 30, 10, 20)
(24, 13)
對應的列表。 當然,這些區域的大小可以根據點的分布而不同。
如果該區域中有任何點,請選擇與原始點距離最短的點; 否則,請查看該區域周圍八個區域的下一個“層”,依此類推。 找到一個點后,您應該再擴展一層,因為這些層中仍然可能有一個點更接近原始點。 (見圖)
這里,紅點是第一個列表中的點,藍點是第二個列表中的點。 這些框對應於地圖中的區域。 盡管在區域中有兩個與原始點直接對應的點,但下一個“層”中有一些點更接近,但是您不必進一步搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.