2016-05-25 74 views
1

我正在使用scikit-learn中的kdtree和一個非常大的數據集。在Python中,需要一種有效的方法將kdtree索引映射到值

我可以讓kdtree在合理的時間內(在我的機器上20分鐘)完成查詢,但我無法將索引映射到它們在任何時間不到1小時內表示的值(我在1小時)。

我加載了2個csv文件(train.csv有29M條記錄,test.csv有8M條記錄)。我對3個鍵感興趣。 'x','y'是花車,'placeid'是一個字符串。

from sklearn.neighbors import KDTree 
import pandas as pd 

train = pd.read_csv("train.csv") 
test = pd.read.csv("test.csv") 

tree = KDTree(train[['x','y']]) 
_, indexes = tree.query(test[['x','y']],k=30) 

# takes 20 minutes to get here. Here is the code that takes more than an hour 

result = [[train.iloc[idx].place_id for idx in idx_set] for idx_set in indexes] 

有沒有更快的方法來做到這一點?我的目標是將所有從KDTree返回的索引映射到place_ids。

回答

1

也許你可以給它一個嘗試,因爲你不想從query距離:

indexes = tree.query(test[['x','y']],k=30,return_distance=False,dualtree=True,sort_results=False) 

這可能會減少一些計算時間的第一部分。 對於第二部分,我正在考慮扁平化或reshape索引和切片place_id而不是雙循環。你能提供result的格式嗎?這只是一個簡單的列表嗎?

+0

感謝您的建議。就結果而言,我試圖根據place_ids得到答案。 kdtree.query返回索引列表。我的問題是將索引映射回該索引的pandas數據框列值。 KDTree正在返回列表清單:[[1,2,3,...],[5,6,7,8,...],...]。我想將其轉換爲字符串列表。 [['place123','place256',...],['place115','place2445',..],..]。在我的例子中,每個元素列表中有30個元素,列表中總共有8M個元素列表。 –

+1

我明白了。你可以試試'ix'而不是'iloc'。雖然'iloc'和'loc'明確直觀,'ix'通常比'iloc'快。 –

+0

感謝您的提示。我會測試一下。 :-) –

相關問題