对于(len(纬度),len(经度))形状的全局分布式变量,我想获得与感兴趣区域相对应的子集。
特定区域由2个角定义(左 - 低纬度/经度,右上纬度/经度)。所以,这个阵列就是我现在所拥有的:
VALUE是一个代表全球分布的二维数组
Lon 是拥有2880个元素的(-180.0,179.875)的一维数组
Lat 是拥有1440个元素的(-90,89.875)的一维数组。
llcrnrlat,urcrnrlat,llcrnrlon,urcrnrlon = 15,50,90,150
注意到librnrlat等可能不包含在 Lon 或 Lat 中,我无法使用
VALUE_SELECT = VALUE[np.where(Lat ==llcrnrlat):np.where(Lat ==urcrnrlat),
np.where(Lon ==urcrnrlat):np.where(Lon ==urcrnrlat)]
所以,我的尝试是循环Lat和Lon,旨在找到最近值的指数。
def find_nearest(array,value): ## This function was clipped from website
idx = (np.abs(array-value)).argmin()
return array[idx]
llcrnrlon,urcrnrlon = 90,150
llcrnrlat, urcrnrlat = 15, 50
nx_st = np.where(lon == (find_nearest(lon,llcrnrlon )))[0]
nx_en = np.where(lon == (find_nearest(lon,urcrnrlon )))[0]
ny_st = np.where(lat == (find_nearest(lat,llcrnrlat )))[0]
ny_en = np.where(lat == (find_nearest(lat,urcrnrlat )))[0]
lon_select,lat_select = lon[nx_st:nx_en+1], lat[ny_st:ny_en+1]
value_select =VALUE[ny_st:ny_en+1,nx_st:nx_en+1]
执行这些子程序后,这里有一个警告:
/Users/anaconda/lib/python2.7/site-packages/ipykernel/ main .py:1:VisibleDeprecationWarning:使用ndim转换数组> 0到索引将导致将来出错 如果名称 =='主要':
答案 0 :(得分:1)
find_nearest + np.where是一大堆计算工作,如果值均匀分布则完全不需要。你真的明白那段代码在做什么吗?阅读每个功能。您正在对数组中的每个值进行减法,然后查找该偏移量的最小值的索引。然后你在最小值处查找值。然后使用该值,您再次查看数组中的每个值并测试它是否匹配,从而创建一个新的True / False值数组。然后,您对该数组进行排序,并找到True的索引。您在argmin()
每个纬度/经度分为8个部分。所以你只需乘以8,对吧?然后将其设为整数,自动应用floor()
function lat_conv(y):
return int((y + 90) * 8)
function lon_conv(x):
return int((x + 180) * 8)
value_select = VALUES[lon_conv(start_lon):lon_conv(stop_lon),
lat_conv(start_lat):lat_conv(stop_lat)]