识别最近的网格点

Posted

技术标签:

【中文标题】识别最近的网格点【英文标题】:Identifying the nearest grid point 【发布时间】:2015-06-16 17:03:40 【问题描述】:

我有三个数组

lat=[15,15.25,15.75,16,....30]
long=[91,91.25,91.75,92....102]

data=
array([[  0. ,   0. ,   0. , ...,   0. ,   0. ,   0. ],
       [  0. ,   0. ,   0. , ...,   0. ,   0. ,   0. ],
       [  0. ,   0. ,   0. , ...,   0. ,   0. ,   0. ],
       ..., 
       [-99.9, -99.9, -99.9, ...,   0. ,   0. ,   0. ],
       [-99.9, -99.9, -99.9, ...,   0. ,   0. ,   0. ],
       [-99.9, -99.9, -99.9, ...,   0. ,   0. ,   0. ]])

它是 [44 cols and 60 rows] 与 long x lat 相同

如果我输入任何点 (16.3,101.6),我需要找出最近的网格并从第三个数组中从该网格中提取数据。我怎样才能在 python 中使用 numpy 呢?这里我举一个例子,但在实际问题中,我有几点。

这个功能我试过了,

def getclosest_ij(lats,lons,latpt,lonpt):
    dis_sq1=(lats-latpt)
    dis_sq2=(lons-lonpt)
    minidex_lat=dis_sq1.argmin()
    minidex_lon=dis_sq2.argmin()
    return minidex_lon,minidex_lat

【问题讨论】:

请向我们展示您解决此问题的尝试 我试图计算每个 lat 和 long 值的绝对距离,并返回该索引以提取该数据,但我得到了错误的值。我在我的问题中添加了我的功能。 只需为差值np.abs(lats-latpt) 等添加绝对值,您的实现应该可以正常工作。 【参考方案1】:

您正在寻找的算法是规则网格上的最近邻插值。例如,您可以使用,

from scipy.interpolate import RegularGridInterpolator

itp = RegularGridInterpolator( (lat, lon), data, method='nearest') 
res = itp(some_new_point)

另外,如果您设置method='linear',此函数还可以执行更精确的线性插值。

【讨论】:

用 numpy 自己能找出来吗?【参考方案2】:

这应该可行:

import numpy as np

lat = np.array(lat)
long = np.array(long)

def get_data(lat_input, long_input):

    lat_index  = np.nanargmin((lat-lat_input)**2)
    long_index = np.nanargmin((long-long_input)**2)
    return data[long_index][lat_index]

您需要 numpy 数组格式的 latlong 数据才能与 nanargmin 函数一起使用。如果您确定数据数组中不会有任何 nan 值,您也可以使用 argmin 而不是 nanargmin

我将差平方而不是取绝对值,因为前者稍微快一些,并且无论如何都会找到相同的索引。

编辑:正如 rth 在 cmets 中对 tom 的回答所指出的那样,argmin 明显快于nanargmin。如果您的数据可能有nan 值,您可以简单地事先更正它们,然后安全地使用argmin。此外,正如汤姆所说,如果您的数据已排序,searchsorted 确实是更好的选择。

【讨论】:

【参考方案3】:

您可以为此使用numpy.searchsorted

import numpy as np

lat=np.linspace(15,30,61)
long=np.linspace(91,102,45)

def find_index(x,y):
    xi=np.searchsorted(lat,x)
    yi=np.searchsorted(long,y)
    return xi,yi

thisLat, thisLong = find_index(16.3,101.6)
print thisLat, thisLong
>>> 6, 43

# You can then access the `data` array like so:
print data[thisLat,thisLong]

注意:这将找到低于兴趣点的latlong 数组的索引。如果你需要最近的点,你可以比较lat[thisLat]lat[thisLat+1]的值

【讨论】:

+1 非常好。使用上面定义的变量,np.searchsorted(lat,x) 比我计算机上的等效调用 np.nanargmin((lat-x)**2) 快 16 倍。 好吧,实际上这不是 NaN 搜索开销,在这个例子中它只比 np.argmin(..) 快 x2。数组大小 (n) 的缩放仍然要好得多:x5 表示 n=1000,x20 表示 n=10000,等等。

以上是关于识别最近的网格点的主要内容,如果未能解决你的问题,请参考以下文章

线上 | 微软亚洲研究院研究员胡瀚:图像识别中的非网格化网络

在二维网格上寻找最近​​物体的算法

2D,C ++中的所有k个最近邻居

如何在网格坐标中找到最近的对象

3D场景鼠标点选择物体

无法读取剑道网格中未定义的属性“最近”