如何解决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 举报,一经查实,本站将立刻删除。