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:打败我,其他人有什么想法?
答案 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...