Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

移動平均(numpy.convolve利用)

移動平均の関数のテスト。
numpy.convolveは、以下が想定とちょっと違ったので。

  • 平均の範囲
  • 戻ってくる大きさ

f:id:Cucco:20190322143841p:plain
計算範囲と結果の数(データ数8、平均幅3)

想定
  • 入力と出力が同じ大きさの配列
  • 2次元配列を処理してほしい
  • データがないところはNAN
プログラム

入力と同じ大きさのnanを用意しておく。
numpy.convolveは、mode=validで計算して、値があるところだけ値を書き込み。

import numpy as np

def movingaverage(data_2d,axis=1,windowsize=3):
    answer = np.zeros((data_2d.shape))
    answer[:,:] = np.nan

    v = np.ones(windowsize,)/windowsize

    for i in range(data.shape[axis]):
        if axis==0:
            answer[i,windowsize-1:]=np.convolve(data_2d[i,:], v, mode = "valid")
        if axis==1:
            answer[windowsize-1:,i]=np.convolve(data_2d[:,i], v, mode = "valid")
        answer=answer
    return answer

#4列のデータが8点
data=np.arange(32)
data=data.reshape(8,4)
print("元データ")
print(data)
print("横方向で平均")
answer = movingaverage(data,axis=0,windowsize=3)#横方向で平均
print(answer)
print("縦方向で平均")
answer = movingaverage(data,axis=1,windowsize=3)#縦方向で平均
print(answer)
実行結果
元データ
[[ 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]]
横方向で平均
[[nan nan  1.  2.]
 [nan nan  5.  6.]
 [nan nan  9. 10.]
 [nan nan 13. 14.]
 [nan nan 17. 18.]
 [nan nan 21. 22.]
 [nan nan 25. 26.]
 [nan nan 29. 30.]]
縦方向で平均
[[nan nan nan nan]
 [nan nan nan nan]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]
 [12. 13. 14. 15.]
 [16. 17. 18. 19.]
 [20. 21. 22. 23.]
 [24. 25. 26. 27.]]