我正在尝试计算大型数组的运行中位数,均值和标准差。我知道如何计算运行平均值,如下所示:

def running_mean(x, N):
    cumsum = np.cumsum(np.insert(x, 0, 0))
    return (cumsum[N:] - cumsum[:-N]) / float(N)


这非常有效。但是我不太明白为什么(cumsum[N:] - cumsum[:-N]) / float(N)可以给出平均值(我是从其他人那里借来的)。

我试图添加另一个返回语句以计算中位数,但它没有达到我想要的效果。

return (cumsum[N:] - cumsum[:-N]) / float(N), np.median(cumsum[N:] - cumsum[:-N])


有人给我一些解决这个问题的提示吗?非常感谢你。

张焕年

最佳答案

cumsum技巧专门用于查找sumaverage值,并且认为您不能简单地扩展它来获取medianstd值。在ufunc数组的滑动/运行窗口中执行通用1D操作的一种方法是创建一系列以2D数组堆叠的基于1D滑动窗口的索引,然后沿堆叠应用ufunc轴。要获取这些索引,可以使用broadcasting

因此,为了执行均值,它看起来像这样-

idx = np.arange(N) + np.arange(len(x)-N+1)[:,None]
out = np.mean(x[idx],axis=1)


要运行medianstd,只需将np.mean分别替换为np.mediannp.std

关于python - 运行或滑动中值,均值和标准差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33585578/

10-12 17:22
查看更多