2016-11-05 14 views
2

Matlabのsmooth関数は、デフォルトで5点移動平均を使用してデータを平滑化します。 Pythonで同じことをする最良の方法は何でしょうか?例えば が、これは私のデータはMatLABのNumPy/Pythonでの円滑な実装(n点移動平均)

0 
0.823529411764706 
0.852941176470588 
0.705882352941177 
0.705882352941177 
0.676470588235294 
0.676470588235294 
0.500000000000000 
0.558823529411765 
0.647058823529412 
0.705882352941177 
0.705882352941177 
0.617647058823529 
0.705882352941177 
0.735294117647059 
0.735294117647059 
0.588235294117647 
0.588235294117647 
1 
0.647058823529412 
0.705882352941177 
0.764705882352941 
0.823529411764706 
0.647058823529412 
0.735294117647059 
0.794117647058824 
0.794117647058824 
0.705882352941177 
0.676470588235294 
0.794117647058824 
0.852941176470588 
0.735294117647059 
0.647058823529412 
0.647058823529412 
0.676470588235294 
0.676470588235294 
0.529411764705882 
0.676470588235294 
0.794117647058824 
0.882352941176471 
0.735294117647059 
0.852941176470588 
0.823529411764706 
0.764705882352941 
0.558823529411765 
0.588235294117647 
0.617647058823529 
0.647058823529412 
0.588235294117647 
0.617647058823529 
0.647058823529412 
0.794117647058824 
0.823529411764706 
0.647058823529412 
0.617647058823529 
0.647058823529412 
0.676470588235294 
0.764705882352941 
0.676470588235294 
0.647058823529412 
0.705882352941177 
0.764705882352941 
0.705882352941177 
0.500000000000000 
0.529411764705882 
0.529411764705882 
0.647058823529412 
0.676470588235294 
0.588235294117647 
0.735294117647059 
0.794117647058824 
0.852941176470588 
0.764705882352941 

平滑化されたデータは、

0 
0.558823529411765 
0.617647058823530 
0.752941176470588 
0.723529411764706 
0.652941176470588 
0.623529411764706 
0.611764705882353 
0.617647058823530 
0.623529411764706 
0.647058823529412 
0.676470588235294 
0.694117647058824 
0.700000000000000 
0.676470588235294 
0.670588235294118 
0.729411764705882 
0.711764705882353 
0.705882352941177 
0.741176470588235 
0.788235294117647 
0.717647058823529 
0.735294117647059 
0.752941176470588 
0.758823529411765 
0.735294117647059 
0.741176470588235 
0.752941176470588 
0.764705882352941 
0.752941176470588 
0.741176470588235 
0.735294117647059 
0.711764705882353 
0.676470588235294 
0.635294117647059 
0.641176470588236 
0.670588235294118 
0.711764705882353 
0.723529411764706 
0.788235294117647 
0.817647058823530 
0.811764705882353 
0.747058823529412 
0.717647058823530 
0.670588235294118 
0.635294117647059 
0.600000000000000 
0.611764705882353 
0.623529411764706 
0.658823529411765 
0.694117647058824 
0.705882352941176 
0.705882352941176 
0.705882352941176 
0.682352941176471 
0.670588235294118 
0.676470588235294 
0.682352941176471 
0.694117647058824 
0.711764705882353 
0.700000000000000 
0.664705882352941 
0.641176470588236 
0.605882352941177 
0.582352941176471 
0.576470588235294 
0.594117647058824 
0.635294117647059 
0.688235294117647 
0.729411764705882 
0.747058823529412 
0.803921568627451 
0.764705882352941 

これを取得するには、MATLABでの構文は私は同じことをやりたい

smooth(data) 

であるべきである場合私はこれを行う関数を見つけることができません。

+0

がhttp://stackoverflow.com/questions/13728392/moving-average-or-と同じこの質問です実行中の意味ですか? –

+0

@BillBell私はそうは思わない – rsnaveen

+0

ここにいくつかの他の例があります:http://scipy-cookbook.readthedocs.io/items/SignalSmooth.html – Moritz

答えて

9

MATLABのsmoooth funcは、両端の2つの要素を処理する方法を除いて、長さが5のスライディングウィンドウ全体の平均化と基本的に同じです。リンクドキュメントごとに、それらの境界例は、これらの式で計算されている - だから、numpyの/ Pythonの上の同じ実装を複製する

yy = smooth(y) smooths the data in the column vector y .. 
The first few elements of yy are given by 

yy(1) = y(1) 
yy(2) = (y(1) + y(2) + y(3))/3 
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5 
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5 
... 

を、私たちは、スライディングウィンドウの総和を取得するためNumPy's 1D convolutionを使用すると、ウィンドウの長さによってそれらを分けることができます我々に平均的な結果を与える。次に、境界elemsの特殊ケース処理値を単に追加します。

そうのようにこのように、我々は、一般的なウィンドウサイズを処理するための実装を持っているでしょう -

def smooth(a,WSZ): 
    # a: NumPy 1-D array containing the data to be smoothed 
    # WSZ: smoothing window size needs, which must be odd number, 
    # as in the original MATLAB implementation 
    out0 = np.convolve(a,np.ones(WSZ,dtype=int),'valid')/WSZ  
    r = np.arange(1,WSZ-1,2) 
    start = np.cumsum(a[:WSZ-1])[::2]/r 
    stop = (np.cumsum(a[:-WSZ:-1])[::2]/r)[::-1] 
    return np.concatenate(( start , out0, stop )) 
+0

ありがとう@Divakar。しかし、 'smooth'関数を使用しようとすると、次のエラーが発生します。 'AttributeError:' list 'オブジェクトに' cumsum '属性がありません。 – rsnaveen

+0

@rsnaveen私は 'a'をNumPy配列と仮定していました。配列とリストの両方を扱えるように修正。 – Divakar

+0

ありがとう@Divakar。 – rsnaveen