Cucco’s Compute Hack

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

移動平均(numpy.convolve利用)1次元

関連記事に乗せている2次元よりは1次元のほうが使い勝手がよさそうなので書き換え。

起点からwindowsizeの範囲で合計するだけではなくて、起点側を,ignoresize個を無視して合計するような形にしている。

np.convolveの2つ目の引数の割当たりかたが想像の逆なので、v=np.flip(v) で反転している。

ソースコード

import numpy as np

def np_moving_sum(data_1d,windowsize=3,ignoresize=0):
    '''
    1次元のリスト or np.array
    '''
    if  data_1d is None:
        data_1d = [1,2,3,5,8,13,21,34,55,89]

    if type(data_1d) == np.ndarray:
        np_data_1d=data_1d
    elif  type(data_1d) == list:
        np_data_1d=np.array(data_1d)

    # np_data_1d.shape は、(10,)
    answer = np.zeros(np_data_1d.shape)
    answer[:] = np.nan
    # vの長さが3の時
    # v[0]=0 3番目にマッピングされる
    # v[1]=1 2番目にマッピングされる
    # v[2]=0 1番目にマッピングされる

    v = np.ones(windowsize)
    v[0:ignoresize]=0
    v=np.flip(v)

    answer[: np_data_1d.shape[0] - windowsize + 1 ]=np.convolve(np_data_1d, v, mode = "valid")

    return answer

def np_moving_average(data_1d,windowsize=3,ignoresize=0):
    return np_moving_sum(data_1d,windowsize,ignoresize)/(windowsize-ignoresize)

if __name__ == "__main__":
    data_1d = [1,2,3,5,8,13,21,34,55,89]
    print(data_1d,'\n')
    print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=2))
    print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=1))
    print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=0))
    print('\n')
    print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=3))
    print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=2))
    print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=1))
    print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=0))
    print('\n')
    print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=2))
    print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=1))
    print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=0))
    print('\n')
    print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=3))
    print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=2))
    print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=1))
    print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=0))

実行結果

(base) C:\>python lib_moving_calcs_np.py
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

[ 3.  5.  8. 13. 21. 34. 55. 89. nan nan]
[  5.   8.  13.  21.  34.  55.  89. 144.  nan  nan]
[  6.  10.  16.  26.  42.  68. 110. 178.  nan  nan]


[ 5.  8. 13. 21. 34. 55. 89. nan nan nan]
[  8.  13.  21.  34.  55.  89. 144.  nan  nan  nan]
[ 10.  16.  26.  42.  68. 110. 178.  nan  nan  nan]
[ 11.  18.  29.  47.  76. 123. 199.  nan  nan  nan]


[ 3.  5.  8. 13. 21. 34. 55. 89. nan nan]
[ 2.5  4.   6.5 10.5 17.  27.5 44.5 72.   nan  nan]
[ 2.          3.33333333  5.33333333  8.66666667 14.         22.66666667
 36.66666667 59.33333333         nan         nan]


[ 5.  8. 13. 21. 34. 55. 89. nan nan nan]
[ 4.   6.5 10.5 17.  27.5 44.5 72.   nan  nan  nan]
[ 3.33333333  5.33333333  8.66666667 14.         22.66666667 36.66666667
 59.33333333         nan         nan         nan]
[ 2.75  4.5   7.25 11.75 19.   30.75 49.75   nan   nan   nan]