いろいろ方法が考えられる。ここではconvolutionを使った方法を示す。ループで回すより(たぶん)速い。
- 例:配列xに3日の移動平均をかける。
x = np.arange(100) w = np.ones(5)/5.0 #scipy.signal.convolveも同じ ave = np.convolve(x,w,'valid')境界は計算せずに重みをつけられる範囲で移動平均をかける場合(先頭、末尾の2日ずつは除く場合)はオプションにvalidを指定する。以下のオプションがある。
- outputサイズ
valid | convolution配列の要素がすべて計算された配列が出力される。出力はlen(input)-len(window)+1 |
---|---|
same | inputと同じサイズ。 |
full | すべてのconvolutionを計算する。出力はlen(input)+len(window)-1 |
- 例:1軸の方向に1-2-1の重み付き移動平均をかける。両端は3-1、1-3の重みで全要素に対して求める。
>>> z array([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]) >>> w1 = np.array([[0,0,0],[1,2,1],[0,0,0]])/4.0 >>> scipy.signal.convolve2d(z, w1, 'valid', 'symm') array([[ 5, 8, 12, 16, 19], [ 5, 8, 12, 16, 19], [ 5, 8, 12, 16, 19], [ 5, 8, 12, 16, 19], [ 5, 8, 12, 16, 19]])これは、
b = np.zeros((5,5)) w = np.array([1,2,1]) for i in range(5): b[i,:] = np.convolve(numpy.r_[a[0], a, a[-1]],weight,'valid')と結果は同じである。
最新コメント