移動平均法! |
今天為了幫我的 IMU 做點低通濾波,跑去查了一下資料。
由於有人推薦使用 移動平均法去計算,我就稍微查了一下,發現了這個 code ...
import numpy as np def moving_average(a, n=3) : ret = np.cumsum(a, dtype=float) ret[n:] = ret[n:] - ret[:-n] return ret[n - 1:] / n
然後駑鈍如我,完全是百思不得其解啊!!
我了解 np.cumsum 是累加數值,也了解 ret[n:] 是代表選取 n 到 list 最後一個數值
但是合起來我就是一個 "你是安怎!?" 的狀況。
代入值實際算了一下:
data = [1,2,3,4,5] ans = moving_average(data) print ans #get [2,3,4]
竟然是正確答案啊!!!
後來用代數寫了一遍他的步驟我才了解....哇靠! 這個寫法真的是太神了XDD
data = [a, b, c, d, e]
ans = [(a+b+c)/3, (b+c+d)/3, (c+d+e)/3]
他用的步驟是...先加總 ret = [a, a+b, a+b+c, a+b+c+d, a+b+c+d+e]
然後選擇 後面項 減去 前面項!!(這傢伙開金手指啊!!),變成:
[a+b+c+d, a+b+c+d+e] - [a, a+b] = [b+c+d, c+d+e]
帶入到原本的 list 裡面,讓
ret = [a, a+b, a+b+c, a+b+c+d, a+b+c+d+e] 被取代成 ret = [a, a+b, a+b+c, b+c+d, c+d+e]
然後只 return ret 的後三項除以三,得到答案 [(a+b+c)/3, (b+c+d)/3, (c+d+e)/3]
超神人的做法啊!!!!! 這招好杯壁!!!!!
大大我真的佩服你啊.....
留言
張貼留言