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

ih99xse1  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(107)

我有两个数据集,第一个是高空间分辨率,它的值是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"])

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

njthzxwz

njthzxwz1#

您可以使用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()

相关问题