如何用Xarray实现二维分组分箱计算网格单元均值?
使用Xarray实现二维分箱并计算网格平均值
完全可行,问题出在二维分箱的分组逻辑上。下面结合你的李萨如图示例场景,给出完整的实现方案:
1. 生成示例数据
先构造带x、y坐标的一维样本数据,存入DataArray:
import numpy as np import xarray as xr # 生成李萨如图的x、y坐标及对应样本值 t = np.linspace(0, 2*np.pi, 1000) x = np.sin(3*t) y = np.sin(4*t) sample_values = np.cos(t) # 示例样本数值 # 创建带MultiIndex的DataArray da = xr.DataArray( sample_values, coords={'point': xr.MultiIndex.from_arrays([x, y], names=['x', 'y'])}, dims=['point'] )
2. 定义分箱规则
设置x、y方向的分箱边界,这里以5×5网格为例:
# 生成6个边界点,对应5个分箱区间 x_bins = np.linspace(x.min(), x.max(), 6) y_bins = np.linspace(y.min(), y.max(), 6)
3. 执行二维分箱并计算平均值
核心是先对x、y坐标分别做分箱标记,再按标记分组求平均:
# 给每个样本分配x、y方向的箱索引 da['x_bin'] = xr.cut(da.point.get_level_values('x'), x_bins, labels=False) da['y_bin'] = xr.cut(da.point.get_level_values('y'), y_bins, labels=False) # 按x_bin和y_bin分组,计算每个网格的平均值 binned_result = da.groupby(['x_bin', 'y_bin']).mean() # 转换为标准5×5二维结构,空网格填充NaN binned_grid = binned_result.unstack(fill_value=np.nan)
最终的binned_grid就是你需要的5×5维度DataArray,每个元素对应对应网格内所有样本的平均值。
报错原因说明
如果之前直接对MultiIndex做分组,会因为索引结构不匹配触发IndexError。正确的思路是先把连续的x、y坐标转换成离散的箱索引,再基于两个维度的索引做分组,就能自然得到二维分箱结果。
内容的提问来源于stack exchange,提问作者titusjan
相关产品推荐
相关产品推荐

