最近邻搜索:Python

时间:2012-10-16 21:20:10

标签: python numpy nearest-neighbor kdtree closest-points

我有一个二维数组:

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树并了解基本概念,但却无法理解如何编写脚本。

1 个答案:

答案 0 :(得分:25)

感谢John Vinyard建议scipy。经过一些很好的研究和测试,以下是这个问题的解决方案:

先决条件: 安装Numpy和SciPy

  1. 导入SciPy和Numpy模块

  2. 制作5维数组的副本,包括 X和Y值。

  3. 创建cKDTree的实例:

    YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100)
    #Play with the leafsize to get the fastest result for your dataset
    
  4. 在6个单位内查询最近邻居的cKDTree

    for item in YourArray:
        TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6)
    

    对于YourArray中的每个项目,TheResult将是两个点之间距离的元组,以及YourArray中点的位置索引。

相关问题