我有三个数组
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
答案 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数组格式的lat
和long
数据才能与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
数组的索引。如果您需要最近的点,则可以比较long
和lat[thisLat]