问题描述
我已经开始使用 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 (将#修改为@)