我正在尝试计算大型数组的运行中位数,均值和标准差。我知道如何计算运行平均值,如下所示:
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
值,并且认为您不能简单地扩展它来获取median
和std
值。在ufunc
数组的滑动/运行窗口中执行通用1D
操作的一种方法是创建一系列以2D数组堆叠的基于1D滑动窗口的索引,然后沿堆叠应用ufunc
轴。要获取这些索引,可以使用broadcasting
。
因此,为了执行均值,它看起来像这样-
idx = np.arange(N) + np.arange(len(x)-N+1)[:,None]
out = np.mean(x[idx],axis=1)
要运行
median
和std
,只需将np.mean
分别替换为np.median
和np.std
。关于python - 运行或滑动中值,均值和标准差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33585578/