Skip to content
11月 8 / rakkyoo

Pythonのnumpyで移動平均(convolveを使って)

データの移動平均をとりたいときは,コンボリューション積分を使うと早いのですが,numpyでもあるのですね.

移動平均は,各点ごとにずらしながら平均を取っていく手法で,
貼り付けた画像 2012 11 08 13 07
●に対する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

CAPTCHA


This blog is kept spam free by WP-SpamFree.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください