簡體   English   中英

大量 x,y 坐標。 找到彼此一定距離內的有效方法?

[英]Large set of x,y coordinates. Efficient way to find any within certain distance of each other?

我在熊貓數據框中有大量數據點,其中包含這些點的 x/y 坐標的列。 我想識別數據框中任何其他點的特定距離“d”內的所有點。

我首先嘗試使用“for”循環來執行此操作,檢查第一個點與所有其他點之間的距離,然后檢查第二個點與所有其他點之間的距離,等等。顯然這對於​​大型數據集不是很有效。

最近在網上搜索表明最好的方法可能是使用 scipy.spatial.ckdtree,但我不知道如何實現它。 我看到的大多數示例都檢查單個 x/y 位置,而我想檢查所有與全部。 是否有人能夠提供建議或示例,從從我的數據框中獲取的 x/y 坐標數組開始,如下所示:

points = df_sub.loc[:,['FRONT_X','FRONT_Y']].values  

看起來像這樣:

[[19091199.587  -544406.722]
 [19091161.475  -544452.426]
 [19091163.893  -544464.899]
 ...
 [19089150.04   -544747.196]
 [19089774.213  -544729.005]
 [19089690.516  -545165.489]]

理想的輸出將是彼此在截止距離“d”內的所有點對的 ID。

scipy.spatial有許多處理距離計算的好函數。

讓我們創建一個包含 1000 (x, y) 個點的數組pos ,類似於您在數據框中的內容。

import numpy as np
from scipy.spatial import distance_matrix

num = 1000
pos = np.random.uniform(size=(num, 2))

# Distance threshold
d = 0.25

從這里我們將使用distance_matrix函數來計算成對距離。 然后我們使用np.argwhere找到小於某個閾值d的所有成對距離的索引。

pair_dist = distance_matrix(pos, pos)

ids = np.argwhere(pair_dist < d)

ids現在包含“彼此在截止距離“d”內的所有點對的 ID,如您所願。

缺點

當然,這種方法有一個缺點,就是我們總是計算每個點與其自身之間的距離(返回距離0 ),它總是小於我們的閾值d 但是,我們可以使用以下軟糖從我們的ids排除自我比較:

pair_dist[np.r_[:num], np.r_[:num]] = np.inf
ids = np.argwhere(pair_dist < d)

另一個缺點是,當我們只需要上三角或下三角成對距離矩陣時,我們會計算完整的對稱成對距離矩陣。 但是,除非此計算確實是您代碼中的瓶頸,否則我不會對此過於擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM