最简单的方法是通过2个角选择2-d数组的子集

时间:2016-06-17 01:10:43

标签: python arrays numpy

对于(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到索引将导致将来出错     如果名称 =='主要':

  • 如何避免此警告或潜在错误?
  • 根据我的情况,有没有更简单的方法来获取二维数组的子集?

1 个答案:

答案 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)]