使用numpy.convolve计算加权移动平均值

13

我正在编写一个移动平均函数,该函数使用Numpy中的卷积函数,这应该等同于(加权移动平均)。当我的权重全部相等时(例如简单算术平均数),它可以正常工作:

data = numpy.arange(1,11)
numdays = 5
w = [1.0/numdays]*numdays
numpy.convolve(data,w,'valid')

提供

array([ 3.,  4.,  5.,  6.,  7.,  8.])

但是,当我尝试使用加权平均时

w = numpy.cumsum(numpy.ones(numdays,dtype=float),axis=0); w = w/numpy.sum(w)

我期望得到的是 3.667、4.667、5.667、6.667......,但实际得到的却是

array([ 2.33333333,  3.33333333,  4.33333333,  5.33333333,  6.33333333,
        7.33333333])
如果我移除了'valid'标志,我甚至看不到正确的值。 我真的很想像MA一样使用卷积进行WMA,因为这样可以使代码更加简洁(相同的代码,不同的权重),否则我认为我必须遍历所有数据并进行切片。
关于这种行为有什么想法吗?
1个回答

20

你想要的是在卷积中使用np.correlate,但是第二个参数需要倒置,这样才能得到你期望的结果,也就是使用np.convolve(data, w[::-1], 'valid')


1
谢谢,我明白了。而且我也不知道 [::-1] 可以反转一个数组/列表。这是非常有用的信息! - Dr. Andrew
2
仅作为评论,np.cumsum(np.ones(numdays,dtype=float),axis=0) 是一种非常复杂的方法来获取 np.arange(numdays)+1. 或者 np.np.arange(1., numdays+1.) - Ramon Crehuet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接