3d阵列的SMA/EMA和LWMA滤波器?



是否有简单移动平均线,指数移动平均线和线性加权移动平均线的Python包?我的输入信号是一个3d数组,我只是不想在这里重新发明轮子。理想的笨蛋?

编辑:这是一个加速度计测量。

滚动平均通常沿着一个维度应用,从你的编辑中,听起来这也是你的情况,你想对加速度计读数应用时间平滑。

Numpy已经准备好了:

import numpy as np
from numpy.lib.stride_tricks import sliding_window_view, as_strided
rng = np.random.default_rng()
data = rng.random(size=(5, 3, 1000))
rolling_window_size = 50
windows = sliding_window_view(data, rolling_window_size, axis=-1)
print(windows.shape)  # (5, 3, 951, 50)
simple_rolling_average = np.sum(windows / rolling_window_size, axis=-1)
# weighted rolling average
weights = rng.random(size=(1, 1, 1, 50))
weighted_rolling_average = np.sum(weights * windows / rolling_window_size, axis=-1)
# exponential rolling average
alpha = .5
n_samples = data.shape[-1]
numerator = np.zeros(2*n_samples-1)
numerator[:n_samples] = (1 - alpha) ** np.arange(n_samples-1, -1, -1)
numerator = as_strided(
numerator[n_samples - 1 :],
(n_samples, n_samples),
(-numerator.itemsize, numerator.itemsize),
)
denominator = np.sum(numerator, axis=-1, keepdims=True)
exponential_rolling_average = np.sum(numerator * data[..., None, :] / denominator, axis=-1)

注释1:我不能100%确定我得到的指数平均值是正确的,但你明白我的意思。我必须查一下它的定义,然后用我在维基百科上找到的一个公式来计算。不管怎样,我想你已经明白了。

注2:我并没有特别认真地考虑在指数平均的情况下,长过滤器长度对准确性的影响,因为指数平均的数字很快就会变得非常小。

最新更新