用两个角点选择二维数组子集的最简单方法

2024-09-27 07:17:03 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个形状为(len(纬度),len(经度))的全局分布变量,我想得到一个对应于感兴趣区域的子集。你知道吗

特定区域由两个角(左低纬度/经度、右上纬度/经度)定义。所以,这个数组就是我现在拥有的:

  • 值是表示全局分布的二维数组

  • Lon是从(-180.0179.875)开始的一维数组,拥有2880个元素

  • Lat是从(-90,89.875)开始的一维数组,拥有1440个元素。

  • llcrnrlat,urcrnrlat,llcrnrlon,urcrnrlon=15,50,90,150

注意llcrnrrat etc可能不包含在LonLat中,我不能使用

 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: converting an array with ndim > 0 to an index will result in an error in the future if name == 'main':

  • 如何避免此警告或潜在错误?你知道吗
  • 根据我的例子,有没有更简单的方法得到二维数组的子集?你知道吗

Tags: np数组findwhereenstlonlat
1条回答
网友
1楼 · 发布于 2024-09-27 07:17:03

找到最近的+np.哪里如果值是均匀分布的,则完全不需要大量的计算工作。你真的明白代码在做什么吗?仔细阅读这些函数。对数组中的每个值进行减法运算,然后找到偏移量最小值的索引。然后你查这个最小值。然后使用该值,再次检查数组中的每个值并测试其是否匹配,从而创建一个新的真/假值数组。然后对数组进行排序,找到正确的索引。与argmin()找到的索引相同

每个lat/lon分为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)]

相关问题 更多 >

    热门问题