我有一个二维数组:
MyArray = array([6588252.24, 1933573.3, 212.79, 0, 0],
[6588253.79, 1933602.89, 212.66, 0, 0],
etc...)
前两个元素MyArray[0]
和MyArray[1]
是点的 X 和 Y 坐标。
对于数组中的每个元素,我想找到最快方式返回半径为 X 单位的单个最近邻居。我们假设这是在2D空间。
让我们举个例子X = 6
。
我通过将每个元素与每个其他元素进行比较来解决问题,但是当列表长度为22k点时,这需要15分钟左右。我们希望最终在大约3000万点的名单上运行。
我已经阅读了关于K-d树并了解基本概念,但却无法理解如何编写脚本。
答案 0 :(得分:25)
感谢John Vinyard建议scipy。经过一些很好的研究和测试,以下是这个问题的解决方案:
先决条件: 安装Numpy和SciPy
导入SciPy和Numpy模块
制作5维数组的副本,包括 X和Y值。
创建cKDTree
的实例:
YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100)
#Play with the leafsize to get the fastest result for your dataset
在6个单位内查询最近邻居的cKDTree
:
for item in YourArray:
TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6)
对于YourArray
中的每个项目,TheResult
将是两个点之间距离的元组,以及YourArray
中点的位置索引。