Scipy KDTree()获得直角形状的相邻网格点

时间:2017-05-04 09:25:36

标签: python scipy kdtree

使用此模块时,我遇到了一个小问题。事实上,该模块正是我要求他做的......这就是找到这个网格中给定坐标的所有最近的网格点。

但是,当给定的坐标非常接近网格的一个点并且网格的一侧有较长的步长时,它会给出类似的结果:

scipy.spatial.KDtree results

因此,在此图像中,计算最近邻居的点是您可以在左下角看到的红点。 KDTree给出的结果是蓝色方块。绿色钻石是我想要获得的第四个点,而不是图像顶部的唯一蓝色钻石。

代码:

>>> grid.head()
          x         y
0  0.000000 -9.490125
1  0.959131 -9.490125
2  1.918263 -9.490125
3  2.877394 -9.490125
4  3.836526 -9.490125

>>> pt
[4.0092010999999998e-05, -9.4901299629261011]

>>>tree = ssp.KDTree(grid)
>>>dis, idx = tree.query(pt,4)

>>> idx 
array([  0,  71,   1, 142])

>>> grid.iloc[idx]
            x         y
0    0.000000 -9.490125
71   0.000000 -8.980481
1    0.959131 -9.490125
142  0.000000 -8.470837

问题:

有没有办法在查询中指定我们想要一个矩形数组?也许通过指定我们只想要一个x的2 y?

1 个答案:

答案 0 :(得分:1)

首先,让我们 尝试 create a Minimal, Complete, and Verifiable example

>>> import pandas as pd
>>> import numpy as np
>>> x0, dx = 0, 0.959131
>>> x  = np.arange(x0, x0+5*dx,dx) 
>>> y0, dy = -9.4901299629261011, 8.980481-8.470837
>>> y  = np.arange(y0, y0+2*dy,dy)
>>> data = np.transpose([np.tile(x, len(y)), np.repeat(y, len(x))])
>>> grid = pd.DataFrame(data=data, columns=['x', 'y'])
>>> grid.head()
          x        y
0  0.000000 -9.49013
1  0.959131 -9.49013
2  1.918262 -9.49013
3  2.877393 -9.49013
4  3.836524 -9.49013

其中grid.head()基于grid图形表示的等效数字

>>> grid
           x         y
0   0.000000 -9.490130 # the red dot
1   0.959131 -9.490130 # the bottom right blue square
2   1.918262 -9.490130
3   2.877393 -9.490130
4   3.836524 -9.490130
5   0.000000 -8.980486 # the middle left blue square
6   0.959131 -8.980486 # the green diamond
7   1.918262 -8.980486
8   2.877393 -8.980486
9   3.836524 -8.980486
10  0.000000 -8.470842 # the unwanted top left blue square
11  0.959131 -8.470842
12  1.918262 -8.470842
13  2.877393 -8.470842
14  3.836524 -8.470842

因此,您希望点156作为点0的邻域。

为此,您可能需要查看the sklearn.neighbors module which implements the k-nearest neighbors algorithmkneighbors_graph函数。使用它,并设置Minkowski metric的功效参数,p,大于2,说3(获取p>2的想法基本上是减少欧几里德平方根因子 - 在对角线和单位正方形的边之间 - 朝向1),如下所示

>>> from sklearn.neighbors import kneighbors_graph
>>> _3n_graph = kneighbors_graph(grid,
                                 n_neighbors=3,
                                 p=3,
                                 mode='connectivity',
                                 include_self=False)

产量

>>> grid.iloc[_3n_graph[0].indices]
          x         y
5  0.000000 -8.980486
1  0.959131 -9.490130
6  0.959131 -8.980486