【发布时间】:2015-02-15 21:45:16
【问题描述】:
我在 python 中工作,我有一个 x,y 网格,它是 numpy 数组。我需要为网格中的每个点 (x1,y1) 找到与 (x1,y1) 距离为 r 的点。 Scipy 有一个函数KDTree.query_ball_tree,它接受一个 KD Tree 对象(可以从 numpy 数组构造)和一个距离 r 作为输入,但我无法理解它是如何工作的。
例如,考虑以下几点:
[(1, 1), (2, 1), (3, 1), (4, 1), (1, 2), (2, 2), (3, 2), (4, 2), (1, 3), (2, 3), (3, 3), (4, 3), (1, 4), (2, 4), (3, 4), (4, 4)]`
我想找到距离(1,1) 2 处的所有点。输出应该是:
[(1,2),(1,3),(2,1),(3,1)]
我使用 KDTree 是因为,我想避免遍历网格的 for 循环,因为网格网格是 601x90 (YxX),如果使用 for 循环,它在时间上不是最佳的。有人可以为我提供一个示例,说明我的情况 KDTree.query_ball_tree 吗?
【问题讨论】:
-
我不明白,如果你有一个对称/均匀的网格,那么找到索引或多或少是微不足道的,因为元素索引与其位置有关。在这种情况下,Kd 树完全是多余的。
-
不,它不是对称网格。 y点和x点之间的距离不一样。 Y 距离为 0.5,X 为 3.4。上面的网格就是一个例子。实际的网格看起来有点像这样.. [(-150,-150),(-149.5,-146.6),(-149,-143.2),(-148.5,-139.8).....]...所以,我们要在这里找到的是任何点,比如说(-149,-143.2),我们要找到半径为 2 内的点。
-
如果 X 和 Y 距离相同,并且点是有序的,那么您仍然不需要 Kd-tree。而且你还没有指定这个
KDTree.query_ball_tree函数是在哪里(在哪个模块)定义的,所以很难回答这个问题。