2017-07-31 193 views
6

我正在嘗試查找距離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萬條記錄),這個數字越來越大,並且在某個點之後由於內存問題而停止。任何想法如何解決這個問題?

+0

您是否考慮過將「鄰居」數據存儲在DataFrame中?想到「networkx.Graph」。 –

+0

抱歉沒有聽說過它。你能寫一個例子嗎?我可以嘗試,可能是。 –

+0

https://networkx.github.io/是一個用於處理圖形數據的庫。在你的情況下,我會將位置標識存儲爲頂點,並在相距不到1公里的位置之間添加邊。該文檔包含一個很好的教程。 –

回答

0

爲了防止有人爲此尋找答案,我通過找到一個組的最近鄰居(tree.query_ball_point可以處理批次)並寫入數據庫然後處理下一個組來解決它,而不是保留全部在內存中。謝謝。

+0

您聲明「tree.query_ball_point可以處理批次」。你可以發佈一些示例代碼? – ximiki

+1

在這個中,tree.query_ball_point(s,1)。 s應該是一個列表。 –