【问题标题】:Optimizing Python KD Tree Searches优化 Python KD 树搜索
【发布时间】:2012-10-16 06:02:39
【问题描述】:

Scipy (http://www.scipy.org/) 提供两个 KD Tree 类; KDTree 和 cKDTree。

cKDTree 比 KDTree 快得多,但可定制性和可查询性较差(据我从文档中得知)。

这是我的问题: 我有一个包含 300 万个二维 (X,Y) 点的列表。我需要返回距离每个点 X 个单位距离内的所有点。

使用 KDtree,有一个选项可以做到这一点:KDtree.query_ball_tree() 它会生成一个列表,其中包含 X 单位内的所有点与其他点的列表。但是:这个列表很大,很快就填满了我的虚拟内存(大约有 7.44 亿个项目)。

可能的解决方案 #1: 有没有办法在编写时将此列表解析为文本文件?

潜在解决方案 #2: 我尝试使用 for 循环(对于列表中的每个点),然后通过使用:KDtree.query_ball_point() 在 X 单位内找到该单点的邻居。但是:这需要很长时间,因为它需要运行数百万次查询。是否有与此 KDTree 工具等效的 cKDTree?

潜在解决方案#3:击败我,其他人有什么想法吗?

【问题讨论】:

    标签: numpy scipy nearest-neighbor kdtree


    【解决方案1】:

    从 scipy 0.12 开始,两个 KD Tree 类都具有特征奇偶性。引用其announcement

    cKDTree 功能齐全

    KDTree 的 Cython 版本 cKDTree 现在功能齐全。最多 操作(构造、查询、query_ball_point、query_pairs、 count_neighbors 和 sparse_distance_matrix) 在 200 到 1000 之间 cKDTree 比 KDTree 快几倍。有非常小的警告, cKDTree 的接口与 KDTree 完全相同,可以作为 直接替换。

    【讨论】:

    • 啊,那太好了。我没有任何从源代码编译的技能/经验,所以也许我会研究一下。否则,除非发布另一个解决方案,否则我将等待 scipy 的新版本。
    • @Dlinet 0.12 版已于上个月发布。
    【解决方案2】:

    尝试改用KDTree.query_ball_point。它采用单个点,或点数组,并在输入点的给定距离内生成点。

    您可以使用此功能执行批量查询。例如,一次给它 100000 个点,然后将结果写入文件。像这样的:

    BATCH_SIZE = 100000
    for i in xrange(0, len(pts), BATCH_SIZE):
        neighbours = tree.query_ball_point(pts[i:i+BATCH_SIZE], X)
        # write neighbours to a file...
    

    【讨论】:

    • 除非我理解错了,否则我认为这正是我列为潜在解决方案 #2 的内容,不是吗?据我所知,这种方法的问题是它需要很长时间。
    • 您的建议是遍历每个点。在这里,我建议以“批处理”模式使用它,这样您就可以减少迭代时间。
    • 很有趣,我会调查一下。我以前从未使用过“批次”。您是否建议任何特定资源来了解有关批次的更多信息?
    猜你喜欢
    • 2015-03-17
    • 2011-05-24
    • 2022-10-15
    • 2015-12-05
    • 2013-05-20
    • 1970-01-01
    • 2013-01-05
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多