2012-10-10 111 views
9

我正在寫在使用numpy的卷積函數,這應該是等效於(weighted moving average)的移動平均函數。當我的權重都相等(如在一個簡單的arithmatic平均),它工作正常:加權移動平均與numpy.convolve

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]) 

如果我刪除'有效'標誌,我甚至沒有看到正確的值。我真的很喜歡用WMA和MA來進行卷積,因爲它使得代碼更清晰(相同的代碼,不同的權重),否則我想我必須遍歷所有數據並進行切片。

有關此行爲的任何想法?

回答

14

你想要的是np.correlate卷積第二個參數基本上是倒置的,以便您的預期結果將與np.convolve(data, w[::-1], 'valid')

+1

謝謝我明白了。而且我也不知道[:: - 1]會顛倒數組/列表。這是非常有用的信息! –

+1

作爲一個簡單的評論,'np.cumsum(np.ones(numdays,dtype = float),axis = 0)'是獲得'np.arange(numdays)+ 1或'np.np .arange(1.,numdays + 1)'。 –