计算(或求和)高结果二维数据中最接近二维粗略分辨率的最接近网格点的网格点数量



我有两个数据集,第一个是高空间分辨率的数据集,其值为0和1,第二个数据集具有粗略的空间分辨率数据(在我的情况下,其值并不重要(。

我想计算高分辨率数据中最接近粗分辨率数据的网格点的网格点数量,其中高分辨率数据的值为1。

换言之,计算落在粗略分辨率数据的像素内的值为1的高分辨率网格点的数量。

粗略空间分辨率数据的数据示例

lon = [ 176.25,  176.75, 177.25,  177.75,  178.25,  178.75,  179.25,  179.75]
lat = [-87.25, -87.75, -88.25, -88.75, -89.25, -89.75]
temperature = np.random.rand(6, 8)
coarse_res = xr.DataArray(temperature, coords={'lat': lat,'lon': lon}, dims=["lat", "lon"])

高空间分辨率数据的数据示例

lon = [176.125,176.375,176.625,176.875,177.125,177.375,177.625,177.875,178.125,178.375,178.625,178.875,179.125,179.375,179.625,179.875]
lat = [-87.125, -87.375, -87.625, -87.875, -88.125, -88.375, -88.625, -88.875, -89.125, -89.375, -89.625, -89.875]
ds_2 = np.random.randint(0, 2, size=(12, 16))
high_res = xr.DataArray(ds_2, coords={'lat': lat,'lon': lon}, dims=["lat", "lon"])

最后,我想计算围绕粗略分辨率网格点的high_res网格点/像素的分数,其值为1。例如,如果coarse_res数据的第一个网格点被4个high-res网格点包围,并且这些值是0, 1, 1, 1,则分数应该是0.75。

您可以使用xr.Dataset.groupby_bins:执行此操作

low_lon_edges = np.arange(176., 178.001, 0.5)
low_lat_edges = np.arange(-90, -86.9, 0.5)
low_lon_centers = (low_lon_edges[:-1] + low_lon_edges[1:]) / 2
low_lat_centers = (low_lat_edges[:-1] + low_lat_edges[1:]) / 2
aggregated = (
high_res
.groupby_bins('lon', bins=low_lon_edges, labels=low_lon_centers)
.sum(dim="lon")
.groupby_bins('lat', bins=low_lat_edges, labels=low_lat_centers)
.sum(dim="lat")
)

此外,如果单元格嵌套完美(看起来您处理的是以半个单元格为中心的1/4和1/2度数据,所以这应该可以正常工作(,您可以只使用xr.Dataset.coarsen:

aggregated = ds.coarsen(lat=2, lon=2, boundary="exact").sum()

最新更新