优化Python KD树搜索

时间:2012-10-25 23:53:50

标签: numpy scipy nearest-neighbor kdtree

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

cKDTree要快得多,但是比KDTree更少可自定义和查询(据我从文档中可以看出)。

这是我的问题: 我有一个3百万二维(X,Y)点的列表。我需要从每个点返回X单位内的所有点。

使用KDtree,可以选择执行此操作:KDtree.query_ball_tree()它会生成一个列表,其中包含每个其他点的X个单位内的所有点。但是:这个列表非常庞大,很快就会填满我的虚拟内存(大约7.44亿个项目)。

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  

cKDTree功能完整

     

CyD版KDTree,即cKDTree,现已完成功能。最   操作(构造,查询,query_ball_point,query_pairs,   count_neighbors和sparse_distance_matrix)介于200和1000之间   cKDTree比KDTree快一倍。有非常小的警告,   cKDTree与KDTree具有完全相同的接口,可以用作   直接替换。

答案 1 :(得分:1)

请尝试使用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...