2016-05-25 1 views
1

私はscikit-learnのkdtreeを非常に大きなデータセットで使用しています。Pythonでは、kdtreeインデックスを値にマップする効率的な方法が必要です

私はkdtreeを使って、ある程度合理的な時間(私のマシンでは20分)でインデックスを取得することができますが、インデックスを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) 

これは最初の部分のためのいくつかの計算時間を短縮することがあります。 2番目の部分については、私はフラットまたは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

私は参照してください。 'iloc'の代わりに' ix'を試すことができます。 'iloc'と' loc'は明示的で直観的ですが、 'ix'は通常' iloc'より速いです。 –

+0

チップをありがとう。私はそれをテストします。 :-) –

関連する問題