如何统计落入粗分辨率像素内的高分辨率值为1的网格点占比?
计算粗分辨率网格内高分辨率0/1数据的1值占比
需求说明
现有两个空间数据集:
- 高分辨率数据集:仅包含0和1两种取值
- 粗分辨率数据集:仅需利用其网格范围,数值无意义
需要统计每个粗分辨率网格对应的高分辨率网格中,值为1的网格点数量占该粗网格内所有高分辨率点总数的比例。例如:某粗网格对应4个高分辨率点,取值为0、1、1、1,则占比为0.75。
示例数据集
粗分辨率数据
import numpy as np import xarray as xr 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.75,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"])
解决方案
从示例数据可见,高分辨率网格的经纬度间隔为0.25,粗分辨率为0.5,正好是2倍关系,以下两种方法均可实现需求:
方法1:用coarsen直接降采样计算均值
由于0/1数据的均值等价于1的占比,直接对高分辨率数据按粗分辨率的倍数降采样,计算均值即可:
# 每个粗网格对应2个高分辨率纬度点、2个经度点 ratio = high_res.coarsen(lat=2, lon=2, boundary='trim').mean()
boundary='trim'用于处理高分辨率点数非整数倍的情况,示例中12个纬度点(6×2)、16个经度点(8×2)刚好匹配粗分辨率维度,无需裁剪。
方法2:映射粗分辨率坐标后分组计算
如果高、粗分辨率网格不是整数倍关系,或需要更灵活的匹配逻辑,可先给高分辨率数据添加粗分辨率坐标标签,再分组计算:
# 为高分辨率数据匹配对应的粗分辨率经纬度标签 high_res_with_coarse = high_res.assign_coords( coarse_lat=lambda x: xr.DataArray(coarse_res.lat, dims='coarse_lat').broadcast_like(x.lat, exclude='coarse_lat').sel(lat=x.lat, method='nearest'), coarse_lon=lambda x: xr.DataArray(coarse_res.lon, dims='coarse_lon').broadcast_like(x.lon, exclude='coarse_lon').sel(lon=x.lon, method='nearest') ) # 按粗分辨率经纬度分组,计算均值(即1的占比) ratio = high_res_with_coarse.groupby(['coarse_lat', 'coarse_lon']).mean() # 调整维度和坐标名称,与粗分辨率数据对齐 ratio = ratio.rename({'coarse_lat': 'lat', 'coarse_lon': 'lon'}).transpose('lat', 'lon')
两种方法得到的结果维度与coarse_res完全一致,可直接对比或后续分析使用。
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

