コンピュータを研究に使うための私的メモ。Python、Fortran、Ubuntu、etc...


Convolution

移動平均

1d配列
いろいろ方法が考えられる。ここでは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サイズ
validconvolution配列の要素がすべて計算された配列が出力される。出力はlen(input)-len(window)+1
sameinputと同じサイズ。
fullすべてのconvolutionを計算する。出力はlen(input)+len(window)-1
2d配列
  • 例: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')
と結果は同じである。
convolution行列(テンソル)を用いる

bスプライン

フィルター

線形トレンドの除去

import scipy.signal as signal
removed = signal.detrend(data, axis=0)

#平均値のみ取り除く場合
removed = signal.detrend(data, type='constant')
#これは以下と同じ
removed = data - data.mean()

情報

管理人/副管理人のみ編集できます