我正在尝试计算大型数组的运行中位数、均值和标准差。我知道如何计算运行平均值如下:
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 技巧专门用于查找 sum 或 average 值,不要认为您可以简单地扩展它以获得 中位数 和std 值。在 1D 数组上的滑动/运行窗口中执行通用 ufunc 操作的一种方法是创建一系列基于 1D 滑动窗口的索引,这些索引堆叠为 2D 数组然后沿堆叠轴应用 ufunc。要获取这些索引,您可以使用 broadcasting .
因此,为了执行运行平均值,它看起来像这样 -
idx = np.arange(N) + np.arange(len(x)-N+1)[:,None]
out = np.mean(x[idx],axis=1)
