移動平均(numpy.convolve利用)
移動平均の関数のテスト。
numpy.convolveは、以下が想定とちょっと違ったので。
- 平均の範囲
- 戻ってくる大きさ
想定
- 入力と出力が同じ大きさの配列
- 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.]]