Pythonのnumpyで移動平均(convolveを使って)
データの移動平均をとりたいときは,コンボリューション積分を使うと早いのですが,numpyでもあるのですね.
移動平均は,各点ごとにずらしながら平均を取っていく手法で,
●に対する3点での移動平均(★印)の場合はこんな感じかと.
とっても簡単なデジタルフィルタです.
これをPythonのNumpyを使って計算する場合は,Convolveを使うととっても簡単でした.
まずは,データを作ります.
1 2 3 4 5 6 7 8 9 | $ python >>> a = np.arange(100) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]) |
これを5点で移動平均する場合は,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>> a = np.arange(100) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]) >>> b = np.ones(5)/5.0 >>> a_ave = np.convolve(a,b,'valid') >>> a_ave array([ 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77., 78., 79., 80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90., 91., 92., 93., 94., 95., 96., 97.]) |
こんな感じでできます.
このように,5個で移動平均する場合は,b = [0.2,0.2,0.2,0.2,0.2]という配列を作って(b = np.ones(5)/5.0の部分),もとデータとこの「b」とのコンボリューション積分をすれば計算できます.
ここで,「’valid’」については,先頭と末尾の平均を取れない部分(今回は,5個で平均なので,先頭2要素と末尾2要素)を省いて出力してくれます.
とっても簡単でした.
Leave a comment