Xarray 的滚动减少没有按预期工作

问题描述

我已经开始使用 Python 的 xarray 包,但遇到了一些意想不到的问题。我有一些每天采样多次的数据,并希望在过去 n 天的同一时间获得滚动中位数,所以我使用 xarray.DataArray.rolling:

编写了一些代码>
window_size = 10 # days

def tod_med(arr,**kwargs):
    if kwargs["axis"] != (3,):
        raise ValueError("Must reduce over time")
    return np.nanmedian(arr[:,:,::daily_samples],axis=3)

sample_winsize = window_size*daily_samples
median_arr = data.rolling(timestamp=sample_winsize,center=False).reduce(tod_med)

这不会产生明显的错误,但如果我检查一个特定的元素,它会产生与更幼稚的方法不同的结果:

>>> tmp = data.rolling(timestamp=sample_winsize,center=False).construct("window_dim")
>>> naive_median = np.nanmedian(tmp[:,axis=3)
>>> np.array(median_arr[0,sample_winsize])
nan
>>> naive_median[0,sample_winsize]
12.2

我希望得到 12.2 结果,因为手动计算确认这是 data[0,:sample_winsize:daily_samples] 的中值。调试时,我还发现 data[0,1:sample_winsize:daily_samples] == tmp[0,sample_winsize,::daily_samples] == arr[0,::daily_samples] (其中 arr 是发送到 tod_med 的参数,我用来减少 xarray.Rolling 对象的函数),这就是我期待,但让这个结果让我非常困惑。

谁能向我解释一下我是如何滥用 reduce 的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)