【问题标题】:In Python, Need an Efficient way to map kdtree indexes to the values在 Python 中,需要一种将 kdtree 索引映射到值的有效方法
【发布时间】:2016-09-23 18:28:58
【问题描述】:

我正在使用来自 scikit-learn 的 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。

【问题讨论】:

    标签: python python-2.7 pandas scikit-learn kdtree


    【解决方案1】:

    也许你可以试一试,因为你不想与query保持距离:

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

    这可能会减少第一部分的一些计算时间。 对于第二部分,我正在考虑扁平化或reshape 索引和切片place_id,而不是双循环。可以提供result的格式吗?它只是一个简单的列表吗?

    【讨论】:

    • 感谢您的建议。就结果而言,我试图在 place_ids 方面得到答案。 kdtree.query 返回索引列表。我的问题是将索引映射回该索引的熊猫数据框列值。 KDTree 正在返回一个列表列表:[[1,2,3,...],[5,6,7,8,...], ...]。我想将其转换为字符串列表。 [['place123','place256',...],['place115','place2445',..],..]。在我的示例中,每个元素列表中有 30 个元素,列表列表中总共有 8M 个元素列表。
    • 我明白了。你可以试试ix 而不是iloc。尽管iloc 和loc 是明确且直观的,但ix 通常比iloc 更快。
    • 感谢您的提示。我会测试一下。 :-)
    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2017-09-09
    • 2018-03-14
    相关资源
    最近更新 更多