在Numpy中为1D数组滚动窗口?

2024-06-01 04:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在Numpy中有效地实现1D数组的滚动窗口?

例如,我有这个纯Python代码片段来计算1D列表的滚动标准偏差,其中observations是1D值列表,而n是标准偏差的窗口长度:

stdev = []
for i, data in enumerate(observations[n-1:]):
    strip = observations[i:i+n]
    mean = sum(strip) / n
    stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1)))

有没有一种方法可以完全在Numpy中实现这一点,即没有任何Python循环?标准差对于numpy.std来说是微不足道的,但是滚动窗口部分完全让我难堪。

我发现了this一篇关于Numpy中滚动窗口的博客文章,但似乎不是针对1D数组的。


Tags: 代码innumpy列表fordata数组mean
3条回答
def moving_avg(x,n):
    mv =  np.convolve(x,np.ones(n)/n,mode='valid')
    return np.concatenate(([np.NaN for k in range(n-1)],mv))

只有一行代码。。。

pd.Series(observations).rolling(n).std()

只需使用blog代码,但将您的函数应用于结果。

numpy.std(rolling_window(observations, n), 1)

你在哪里(从博客上):

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

相关问题 更多 >