Numpy 中一维数组的滚动窗口?

新手上路,请多包涵

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

例如,我有这个纯 Python 代码片段来计算一维列表的滚动标准偏差,其中 observations 是一维值列表,而 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 是微不足道的,但滚动窗口部分完全难倒了我。

我在 Numpy 中找到 了这篇 关于滚动窗口的博文,但它似乎不适用于一维数组。

原文由 c00kiemonster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

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

IE

 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)

原文由 so12311 发布,翻译遵循 CC BY-SA 3.0 许可协议

Numpy 1.20 开始,您可以使用 sliding_window_view 直接获得滚动窗口:

 from numpy.lib.stride_tricks import sliding_window_view

sliding_window_view(np.array([1, 2, 3, 4, 5, 6]), window_shape = 3)
# array([[1, 2, 3],
#        [2, 3, 4],
#        [3, 4, 5],
#        [4, 5, 6]])

原文由 Xavier Guihot 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题