Cucco’s Compute Hack

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

移動標準偏差

移動平均同様、numpyを使って、2次元のマトリックスに対する移動標準偏差の計算。
移動平均も内部で利用。

プログラム
import numpy as np

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

    v = np.ones(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

def moving_average(data_2d,axis=1,windowsize=3):
    return moving_sum(data_2d,axis,windowsize)/windowsize

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

    answer = moving_sum(np.square(data_2d),axis,windowsize) -\
        np.square(moving_average(data_2d,axis,windowsize))*windowsize
    answer = answer/(windowsize)
    answer = np.sqrt(answer)

    return answer

#4列のデータが8点
#data=np.arange(32)
#data=np.random.rand(32)
#data=data.reshape(8,4)

#検算のため即値で
data=np.array([[0.86619006, 0.9130783,  0.51988756, 0.35008161],
 [0.12355818, 0.3230697,  0.70366867, 0.74275339],
 [0.58942652, 0.74948935, 0.30359438, 0.55652164],
 [0.40820522, 0.85400935, 0.29218585, 0.21874757],
 [0.06330341, 0.91181499, 0.73940466, 0.88877802],
 [0.7945424,  0.67662696, 0.44624821, 0.65392414],
 [0.26358476, 0.43238069, 0.00853011, 0.05989708],
 [0.89179866, 0.52684014, 0.14116962, 0.6934826 ]])


print("元データ")
print(data)
print("横方向で平均")
answer = moving_average(data,axis=0,windowsize=3)
print(answer)
print("縦方向で平均")
answer = moving_average(data,axis=1,windowsize=3)
print(answer)
print("横方向で標準偏差")
answer=moving_std(data,axis=0,windowsize=3)
print(answer)
print("縦向で標準偏差")
answer=moving_std(data,axis=1,windowsize=3)
print(answer)
print("検算 縦向 右下の値 標準偏差")
print(data[5:8,3])
print(np.std(data[5:8,3]))
実行結果
元データ
[[0.86619006 0.9130783  0.51988756 0.35008161]
 [0.12355818 0.3230697  0.70366867 0.74275339]
 [0.58942652 0.74948935 0.30359438 0.55652164]
 [0.40820522 0.85400935 0.29218585 0.21874757]
 [0.06330341 0.91181499 0.73940466 0.88877802]
 [0.7945424  0.67662696 0.44624821 0.65392414]
 [0.26358476 0.43238069 0.00853011 0.05989708]
 [0.89179866 0.52684014 0.14116962 0.6934826 ]]
横方向で平均
[[       nan        nan 0.76638531 0.59434916]
 [       nan        nan 0.38343218 0.58983059]
 [       nan        nan 0.54750342 0.53653512]
 [       nan        nan 0.51813347 0.45498092]
 [       nan        nan 0.57150769 0.84666589]
 [       nan        nan 0.63913919 0.59226644]
 [       nan        nan 0.23483185 0.16693596]
 [       nan        nan 0.51993614 0.45383079]]
縦方向で平均
[[       nan        nan        nan        nan]
 [       nan        nan        nan        nan]
 [0.52639159 0.66187912 0.5090502  0.54978555]
 [0.37372997 0.64218947 0.43314963 0.50600753]
 [0.35364505 0.8384379  0.44506163 0.55468241]
 [0.42201701 0.81415043 0.49261291 0.58714991]
 [0.37381019 0.67360755 0.39806099 0.53419975]
 [0.64997527 0.5452826  0.19864931 0.46910127]]
横方向で標準偏差
[[       nan        nan 0.17534819 0.23579612]
 [       nan        nan 0.24064464 0.18930211]
 [       nan        nan 0.1844338  0.18258364]
 [       nan        nan 0.24217704 0.28374409]
 [       nan        nan 0.36618303 0.07642602]
 [       nan        nan 0.14464027 0.10366564]
 [       nan        nan 0.17422663 0.1888656 ]
 [       nan        nan 0.30648191 0.23131534]]
縦向で標準偏差
[[       nan        nan        nan        nan]
 [       nan        nan        nan        nan]
 [0.30643714 0.24870894 0.16350932 0.16037833]
 [0.1917459  0.22965072 0.19134254 0.21688596]
 [0.21822617 0.06717765 0.20818406 0.27354188]
 [0.29868678 0.10006632 0.1854965  0.27758398]
 [0.30853401 0.19573988 0.30031751 0.34881834]
 [0.27608926 0.10056226 0.1832616  0.28980139]]
検算 縦向 右下の値 標準偏差
[0.65392414 0.05989708 0.6934826 ]
0.28980139385514914