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

时间:2021-06-09 15:14:16

标签: python python-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[:,:,:,::daily_samples], axis=3)
>>> np.array(median_arr[0,0,sample_winsize])
nan
>>> naive_median[0,0,sample_winsize]
12.2

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

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

0 个答案:

没有答案