运行或滑动中位数,平均值和标准差

Hua*_*ang 1 python numpy mean median

我试图计算一个大数组的运行中位数,平均值和标准.我知道如何计算运行平均值如下:

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

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

我试图添加另一个返回句来计算中位数,但它没有做我想要的.

return (cumsum[N:] - cumsum[:-N]) / float(N), np.median(cumsum[N:] - cumsum[:-N])
Run Code Online (Sandbox Code Playgroud)

有没有人提供一些提示来解决这个问题?非常感谢你.

张焕安

Div*_*kar 5

这个cumsum技巧特定于查找sumaverage值,并且不认为您可以简单地扩展它以获取medianstd值.ufunc1D阵列上的滑动/运行窗口中执行通用操作的一种方法是创建一系列基于1D滑动窗口的索引,其堆叠为2D阵列,然后ufunc沿着堆叠轴应用.要获得这些索引,您可以使用broadcasting.

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

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

对于运行medianstd,只需更换np.meannp.mediannp.std分别.