Skip to main content
 首页 » 编程设计

python之带权重的 Xarray 滚动平均值

2025年05月04日12mate10pro

当我使用 numpy 中的权重进行运行/滚动时,我例如做这样的事情:

data = np.random.random(100)  # Example data... 
weights = np.array([1, 2, 1]) 
data_m = np.convolve(data, weights/float(np.sum(weights)), "same") 

然后将 data_m[0] 和 data_m[-1] 替换为例如nans,取决于应用。

类似的事情可以用 xarray 完成。我所做的(在这种情况下)是

xr.DataArray(data).rolling(dim_0=3, center=True).mean(dim="dim_0") 

但这对应于权重

weights = np.array([1, 1, 1]) 

在 numpy 示例中。使用 xarray 时如何应用其他权重?

请您参考如下方法:

加权滚动均值尚未在 xarray 中实现。

下面的代码做几乎相同的事情,但速度会很慢。 我认为使用np.convolve是目前最好的选择。

def weighted_sum(x, axis): 
    weight = [1, 2, 1] 
    if x.shape[axis] == 3: 
        return np.sum(x * weight, axis=axis) 
    else: 
        return np.nan 
 
da.rolling(dim_0=3, center=True).reduce(weighted_sum) 

目前,我们正在努力支持更灵活(和更快)的滚动操作。参见 https://github.com/pydata/xarray/pull/1837

编辑:

使用 xarray=0.10.2,加权滚动平均值可以计算如下,

weight = xr.DataArray([0.25, 0.5, 0.25], dims=['window']) 
da.rolling(dim_0=3, center=True).construct('window').dot(weight) 

其中 construct 方法构造滚动对象的 View ,其中窗口维度(在上例中名为 window)附加到最后一个位置。 与权重数组的内积给出了沿窗口维度的加权和。