私は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にマップすることです。
ありがとうございます。結果として、私はplace_idsの観点から答えを得ようとしています。 kdtree.queryはインデックスのリストを返します。私の問題は、インデックスをそのインデックスのpandasデータフレーム列の値にマッピングすることです。 KDTreeは[[1,2,3、...]、[5,6,7,8、...]、...]のリストを返す。私はこれを文字列のリストに変換したい。 [['place123'、 'place256'、...]、['place115'、 'place2445'、..]、..]。私の例では、各要素リストには30の要素があり、リストのリストには合計8Mの要素リストがあります。 –
私は参照してください。 'iloc'の代わりに' ix'を試すことができます。 'iloc'と' loc'は明示的で直観的ですが、 'ix'は通常' iloc'より速いです。 –
チップをありがとう。私はそれをテストします。 :-) –