识别最近的网格点

时间:2015-06-16 17:03:41

标签: python python-2.7 numpy

我有三个数组

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和60行]与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

3 个答案:

答案 0 :(得分:4)

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

from scipy.interpolate import RegularGridInterpolator

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

作为奖励,如果您设置method='linear',此功能还可以执行更精确的线性插值。

答案 1 :(得分:4)

这应该有效:

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函数一起使用。如果您确定数据阵列中不存在任何argmin值,您也可以使用nanargmin代替nan

我将差异平方而不是取绝对值,因为前者稍微快一些,导致找到相同的索引。

编辑:正如汤姆的回答中所指出的,argmin明显快于nanargmin。如果您的数据可能包含nan个值,则可以先预先更正,然后安全使用argmin。此外,正如汤姆所提到的,如果您的数据已经排序,searchsorted确实是更好的选择。

答案 2 :(得分:2)

您可以使用numpy.searchsorted

$(".element").on({
    mouseenter: function () {
        $(this).css('background-color', 'blue');
    },
    mouseleave: function () {
        $(this).css('background-color', 'transparent');
    },
    mousedown: function () {
        dragOn = true;
    }
});

注意:这将找到低于目标点的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] lat数组的索引。如果您需要最近的点,则可以比较longlat[thisLat]

的值