2012-10-10 34 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のためにconvolveを使用したいと思います。そうしないと、すべてのデータをループしてスライスする必要があります。

この現象に関するご意見はありますか?

答えて

14

畳み込みでnp.correlateを使用すると、2番目の引数は基本的に反転されているため、期待される結果はnp.convolve(data, w[::-1], 'valid')になります。

+1

ありがとうございます。また、[:: - 1]が配列/リストを逆転させることも知りませんでした。それは非常に有益な情報です! –

+1

単なるコメントで、 'np.count(np.ones(numdays、dtype = float)、axis = 0)'は 'np.arange(numdays)+ 1'や' np.np .arange(1。、numdays + 1。) '。 –