2016-04-23 8 views
0

私はnumpy.convolveを使っています。正直言って私が働いているプロジェクトに正しいモジュールを使用しているかどうかはわかりません。 質問: numpy convolveが必要な場合(または実装できる他のモジュールがある場合)、以前の数値を変更しないでください。たす。私は古い番号が変わることを望みません。私はそれらを修正して欲しいです。だから私が新しいデータを取得するときに影響を与えるべき数字は、新しいものだけであり、残りのものではありません。ここでnumpy.convolve python古い番号は変更できません

は例です(。良いことを明確にするために)

import numpy 

N = 3 
numbers = [11,-5,54,-100,1] 
numbers_mean = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):] 
print numbers_mean 

出力:

[ 20.   -17.   -15.   -33.   0.33333333] 

しかし 私は100点の代わりに、1結果の変化への最後の番号を変更した場合すべての3つの数字。

N = 3 
numbers = [11,-5,54,-100,100] 
numbers_mean = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):] 
print numbers_mean 

出力:

[ 20.   -17.   18.   0.   33.33333333] 

JUST OUTPUTS: 。 。

[ 20.   -17.   -15.   -33.   0.33333333] 
[ 20.   -17.   18.   0.   33.33333333] 

これは私が見たいです:

[ 20.   -17.   -15.   -33.   33.33333333<- this number only should change not the rest] 

数は、それが-33を変更し、1から100まで行くとき、あなたが見ることができるように。これは私が望むものではありません。それらの数字のすべてを固定し、変更できる唯一の数字を変更するものは、最新の数字ではありません。この場合、33.333333から0.3333

私はこれをPythonで移植することができますか?

iがnumpyの専門家ではないので、私はあなたにそのためのPythonのソリューションを提案しますあなたの

答えて

1

IIUCを、あなたは3近傍の手段を計算したいです。だからmask=[1./3,1./3,1./3]のサイズはNです。

M>=Nあるサイズ、numbers = [0,1,2,3,4]、単純な例で起こるかを参照してください:

In [1]: numpy.convolve(numbers,mask) 
Out[1]: 
array([ 0.  , 0.33333333, 1.  , 2.  , 3.  , 
     2.33333333, 1.33333333]) 

これはN+M-1の要素を持つ配列です。ここにはM-2(N-1)の有効な手段[1,2,3]しかありません。最初と最後にはN-1が重複しています。それらも破棄する必要があります。あなたのケースでは

N = 3 
a1 = [11,-5,54,-100,1] 
a2 = [11,-5,54,-100,100] 

mask=numpy.ones(N)/N 
m1= numpy.convolve(a1, mask)[(N-1):-(N-1)] 
m2= numpy.convolve(a2, mask)[(N-1):-(N-1)] 
print (m1,m2) 

# [ 20. -17. -15.] [ 20. -17. 18.] 

のみ最後の項が影響を受けます。ここで

mean(n) - mean(n-1) = data(n)/N -data(n-N)/N

EDITは

  • N-1最後の用語を避けるために、他のアプローチは、差分方程式を実装scipy.signal.lfilterを、使用することです。

    from scipy.signal import lfilter 
    N=3 
    a=np.array([1,-1]) 
    b=np.concatenate(([1],np.zeros(N-1),[-1]))/N 
    x=np.arange(5) 
    means=lfilter(b,a,x) 
    # array([0.,0.3333,1.,2.,3.]) 
    
+0

4番目の数字はどのような計算になりますか?私はデータが遅れていることはできません。それは先導する必要があります。したがって、すべての数値には計算が必要です。たとえば、5つの数値がある場合、平均[2 + 3 + 4 + 1 + 8]/5 = 3.6を求めたいと思います。次に新しいデータが得られるようになりました[2 + 3 + 4 + 1 + 8 + 4]という6つの数字の合計があり、5でもう一度分割したいと考えています(今の場合はいつも)3 + 4 + 1 + 8 +4]/5 = 4となる。ここでも新しいデータが得られます。合計で7 + 4 + 1 + 8 + 4 + 9の数字があり、5で除算するので、[4 + 1 + 8 + 4 + 9]/5 = 5.2となります。これは私が畳んで欲しいものです。出来ますか??? –

+1

私は他のアプローチを提案しましたが、あなたの目標を理解しているかどうかはわかりません。これらの方法はすべて、新しいデータごとにすべての手段を再計算する必要があります。 –

+0

私のためにconvoleを明確にしてくれてありがとう。さらに、私は完全なデータにこの式tmwrを試してみます。唯一のことは、ゼロはnp.zerosでなければならず、アレンジはnp.arangeでなければならないと思います。 :) ありがとうございました –

0

ありがとう:

In [342]: fixed = np.convolve([11,-5,54,-100,1], np.ones((N,))/N)[(N-1):-1] 

In [343]: fixed 
Out[343]: array([ 20., -17., -15., -33.]) 

In [344]: np.append(fixed, np.convolve([11,-5,54,-100,100], np.ones((N,))/N)[-1]) 
Out[344]: array([ 20.  , -17.  , -15.  , -33.  , 33.33333333]) 
+0

この種類の作業は唯一の問題です。最後の番号のみが変更されます。私は3つの数字ごとにそれをする必要があります。データ全体は実際の確率的なものを反映している。何かアドバイス? –

関連する問題