![](/img/trans.png)
[英]Fast way find strings within hamming distance x of each other in a large array of random fixed length strings
[英]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.