我正在嘗試查找距離1 KM範圍內的所有最近鄰居。這裏是我的腳本來構建樹和搜索最近點,優化scipy最近鄰居搜索
from pysal.cg.kdtree import KDTree
def construct_tree(s):
data_geopoints = [tuple(x) for x in s[['longitude','latitude']].to_records(index=False)]
tree = KDTree(data_geopoints, distance_metric='Arc', radius=pysal.cg.RADIUS_EARTH_KM)
return tree
def get_neighbors(s,tree):
indices = tree.query_ball_point(s, 1)
return indices
#Constructing the tree for search
tree = construct_tree(data)
#Finding the nearest neighbours within 1KM
data['neighborhood'] = data['lat_long'].apply(lambda row: get_neighbors(row,tree))
從我在pysal頁面讀取,它說 -
kd樹建在SciPy的的kd樹的功能之上。如果使用scipy 0.12或更高版本使用scipy.spatial.cKDTree,否則使用scipy.spatial.KDTree。
在我的情況下,它應該使用cKDTree。這對於示例數據集工作正常,但由於tree.query_ball_point
返回索引列表作爲結果。每個列表將有100個元素。對於我的數據點(200萬條記錄),這個數字越來越大,並且在某個點之後由於內存問題而停止。任何想法如何解決這個問題?
您是否考慮過將「鄰居」數據存儲在DataFrame中?想到「networkx.Graph」。 –
抱歉沒有聽說過它。你能寫一個例子嗎?我可以嘗試,可能是。 –
https://networkx.github.io/是一個用於處理圖形數據的庫。在你的情況下,我會將位置標識存儲爲頂點,並在相距不到1公里的位置之間添加邊。該文檔包含一個很好的教程。 –