xarray技术求助:1D DataArray相邻值求平均结果异常
解决xarray中相邻值平均值的坐标对齐问题
嘿,作为xarray新手碰到这个坑太正常啦!我完全懂你的困惑——本来想得到34个相邻值的平均值,结果因为xarray的自动对齐机制,输出变成了33个元素,和p[1:-1]一致。
为什么会出现这个问题?
当你尝试用(p[:-1] + p[1:])/2这种方式计算时,xarray会自动对齐两个切片的坐标:
p[:-1]的坐标范围是第0到第33个索引p[1:]的坐标范围是第1到第34个索引
xarray的二元运算默认只保留两个数组坐标的交集(也就是第1到第33个索引),所以最终结果长度变成了33,完全不是你想要的结果。
几种可行的解决方案
方法1:用shift错位计算,再裁剪结果
shift方法可以帮你把数组元素整体偏移,这样就能避开坐标对齐的问题:
import xarray as xr # 计算原数组和偏移一位后的数组的平均值 avg_da = (p + p.shift(dim=0, periods=-1)) / 2 # 去掉最后一个NaN元素(因为最后一个元素没有下一个值可以配对) result = avg_da[:-1]
这样得到的result就是长度34的相邻值平均值数组,坐标和p[:-1]一致(对应每一对相邻元素的前一个坐标)。
方法2:用rolling滑动窗口计算
xarray的rolling方法可以轻松实现滑动窗口统计,我们用窗口大小为2的滚动均值,再去掉第一个无效值:
# 窗口大小为2的滚动均值,第一个元素为NaN rolling_avg = p.rolling(dim=0, window=2).mean() # 取从第二个元素开始的结果,正好是34个相邻平均值 result = rolling_avg[1:]
这个方法更简洁,结果的坐标和p[1:]一致(对应每一对相邻元素的后一个坐标)。
方法3:直接用numpy数组计算(保留自定义坐标)
如果你想完全掌控坐标(比如用相邻坐标的中点作为新数组的坐标),可以先转换成numpy数组计算,再重新构建DataArray:
# 用numpy计算相邻值的平均值 np_avg = (p.values[:-1] + p.values[1:]) / 2 # 可选:计算中点坐标(如果你的坐标是数值型的) mid_coords = (p.coords[p.dims[0]][:-1] + p.coords[p.dims[0]][1:]) / 2 # 构建新的DataArray result = xr.DataArray( np_avg, coords={p.dims[0]: mid_coords}, # 这里可以换成p.coords[p.dims[0]][:-1]或者你想要的坐标 name='p_adjacent_avg' )
这个方法适合对坐标有特殊需求的场景,比如气象、海洋数据中常用中点坐标表示相邻值的统计结果。
总结
这三种方法都能解决你的问题,其中shift和rolling是最贴合xarray原生用法的,推荐优先尝试。如果需要自定义坐标,第三种方法更灵活。
内容的提问来源于stack exchange,提问作者Mike Byrne
相关产品推荐
相关产品推荐

