scipy 在python中,有没有什么方法可以使用最近邻将值从一个较细分辨率的网格填充到一个较粗分辨率的网格?

6xfqseft  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(151)

我正在使用MODIS主动火灾数据(数据分辨率为1千米)。在从中获得有意义的信息后,我有一个大小为的数组(72 x4797 x4797)[时间x纬度x长度],并啮合了(4797 × 4797)和长(4797 × 4797).纬度网格从40 N减小到0,均匀dy为0.0108,使得网格的值在行中变化,而每列相同.然而,经度网格的值在行和列中变化,我猜这是因为对于每个纬度,经度的值由于卫星条带而不同。
我的目标是在WRF网格(纬度129 x经度109,分辨率为30公里)上获得这些数据。数据中包含所有无火点的NaN值和活跃火点的值。使用griddata的Scipy插值返回所有NaN的数组,由于所有信息都丢失了,因此该数组没有任何用处。
为了在新纬度上获得粗分辨率数据,我尝试使用最近邻法,例如,如果细网格中存在多个活跃火灾,则将该纬度分配给最近的粗网格纬度,同时取粗网格正方形中所有此类点的平均值。
在下面的代码中,

  • lon_wrf、lat_wrf是粗略分辨率下感兴趣的新经度和纬度。
  • lon_mosaic和lat_mosaic都是高分辨率的经度和纬度的二维数组。
  • Block_OC_day是将在较新的粗分辨率上制作的2-D阵列。

我首先找到所有不是NaN的火灾位置,并提取这些位置的lon和lat。接下来,我在目标网格中找到最近的lon和lat。函数给我索引和值。接下来,我想对目标网格中具有相同lat-lon的所有点的Block_OC_day值取平均值。

lat_1d = lat_mosaic[:,0]                          # making 2-D latitude mesh to 1-D
fire_loc = np.argwhere(~np.isnan(Block_OC_day))   # finding all locations with non-NaN

fire_lat = lat_1d[fire_loc[:,0]]                    # finding latitude of fine resolution
fire_lon = lon_mosaic[fire_loc[:,0],fire_loc[:,1]]  # finding longitue of fine resolution

# Function to find nearest values and index

def nearest(value_to_search,lookup_array):
    '''Finds nearest value and index closest to a value in an array'''

    idx = np.argmin(np.abs(lookup_array-value_to_search))
    closest_value = lookup_array[idx]

    return closest_value, idx

# Storing target latitude and index

va_lat = []
li_lat = []
for i in range(0,len(fire_lat)):
    a, idx = nearest(fire_lat[i],lat_wrf)
    va_lat.append(a)
    li_lat.append(idx)

# storing target longitude and index

va_lon = []
li_lon = []
for i in range(0,len(fire_lon)):
    a, idx = nearest(fire_lon[i],lon_wrf)
    va_lon.append(a)
    li_lon.append(idx)
eulz3vhy

eulz3vhy1#

我已经找到了解决这个问题的方法,它包括找出纬度和经度的公共指数,然后用细网格中所有点的平均值来填充它们。
可能有更好的解决方案,但此代码工作正常。


# Using specific indices

i = 108
j = 128

# np.argwhere(li_lon==i)

# np.argwhere(li_lat == j)

inter = np.intersect1d(np.argwhere(li_lon==i), np.argwhere(li_lat == j))  # finding locations to replace

# fire_lon[inter]

# fire_lat[inter]

NoNaNFire = Block_OC_day[~np.isnan(Block_OC_day)]   # extracting values at those locations
AvgFire = np.nanmean(NoNaNFire[inter])  # averaging all fine-grid points

# AvgFire returns the average value of variable at i and j of coarse grid

# For any 2-D coarse grid

Block_WRF = np.empty((lat_wrf.shape[0],lon_wrf.shape[0]))
for i in range(0,len(lon_wrf)):
     for j in range(0,len(lat_wrf)):
         inter = np.intersect1d(np.argwhere(li_lon==i), np.argwhere(li_lat == j))
         Block_WRF[j,i] = np.nanmean(NoNaNFire[inter])

相关问题