有没有办法在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的标准差很小,但滚动窗口部分完全难住了我.

我在Numpy上找到了this篇关于滚动窗口的博文,但它似乎不适用于1Darray.

推荐答案

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

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)

Python-3.x相关问答推荐

根据其他数据框架的列顺序从数据框架中进行 Select

估计列表中连续对的数量

不同的焦点顺序和堆叠顺序 tkinter

PyTest:尽管明确运行了测试,但是被标记为没有运行测试

仅当从 USB 摄像头接收到新图像时才处理图像

使用 python 查找标记的元素

获取以特定字母开头的姓氏

请求:RecursionError:超出最大递归深度

在 jupyter notebook 的单元格中使用 sudo

Seaborn 热图 colored颜色 条标签作为百分比

Python 3 变量名中接受哪些 Unicode 符号?

Python 3:函数参数中的省略号?

Python 3.10 模式匹配 (PEP 634) - 字符串中的通配符

virtualenv virtualenvwrapper virtualenv:错误:无法识别的参数:--no-site-packages

如何编写可 Select 充当常规函数的 asyncio 协程?

Python 3 与 Python 2 映射行为

创建集合的 Python 性能比较 - set() 与 {} 文字

如何在 jupyter notebook 5 中逐行分析 python 3.5 代码

命名参数可以与 Python 枚举一起使用吗?

使用 Python 3 读取 CSV 文件