numpy.lib.stride_tricks.sliding_window_view#
- lib.stride_tricks.sliding_window_view(x, window_shape, axis=None, *, subok=False, writeable=False)[源代码]#
使用给定的窗口形状创建一个滑动窗口视图到数组中.
也称为滚动窗口或移动窗口,窗口在数组的所有维度上滑动,并在所有窗口位置提取数组的子集.
在 1.20.0 版本加入.
- 参数:
- xarray_like
要创建滑动窗口视图的数组.
- window_shapeint 或 int 的元组
每个轴上参与滑动窗口的窗口大小.如果 axis 不存在,则必须与输入数组维度的数量相同.单个整数 i 被视为如果是元组 (i,).
- axisint 或 int 的元组,可选
滑动窗口应用的轴或轴.默认情况下,滑动窗口应用于所有轴,`window_shape[i]` 将引用 x 的轴 i.如果 axis 给定为一个 int 的元组,`window_shape[i]` 将引用 x 的轴 axis[i].单个整数 i 被视为它们是元组 (i,).
- subok布尔值, 可选
如果为真,子类将被传递,否则返回的数组将被强制为基类数组(默认).
- writeable布尔值, 可选
当为真时,允许写入返回的视图.默认值为假,因为应谨慎使用此选项:返回的视图包含相同的内存位置多次,因此写入一个位置会导致其他位置发生变化.
- 返回:
- viewndarray
数组的滑动窗口视图.滑动窗口的维度插入到最后,并且根据滑动窗口的大小对原始维度进行必要的修剪.即,``view.shape = x_shape_trimmed + window_shape``,其中
x_shape_trimmed
是x.shape
的每个条目减少对应窗口大小减一的结果.
参见
lib.stride_tricks.as_strided
一个较低级别的、安全性较低的例程,用于从自定义形状和步幅创建任意视图.
broadcast_to
将数组广播到给定的形状.
备注
对于许多应用程序来说,使用滑动窗口视图可能很方便,但可能会非常慢.通常存在专门的解决方案,例如:
scipy.ndimage
中的过滤函数由 bottleneck 提供的移动窗口函数.
粗略估计,使用输入大小为 N 和窗口大小为 W 的滑动窗口方法将按 O(N*W) 缩放,而通常特殊算法可以达到 O(N).这意味着窗口大小为 100 的滑动窗口变体可能比更专门的版本慢 100 倍.
然而,对于小窗口尺寸,当没有自定义算法存在时,或者作为一种原型设计和开发工具,这个功能可以是一个好的解决方案.
示例
>>> import numpy as np >>> from numpy.lib.stride_tricks import sliding_window_view >>> x = np.arange(6) >>> x.shape (6,) >>> v = sliding_window_view(x, 3) >>> v.shape (4, 3) >>> v array([[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]])
这也可以在更多维度上工作,例如.
>>> i, j = np.ogrid[:3, :4] >>> x = 10*i + j >>> x.shape (3, 4) >>> x array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]]) >>> shape = (2,2) >>> v = sliding_window_view(x, shape) >>> v.shape (2, 3, 2, 2) >>> v array([[[[ 0, 1], [10, 11]], [[ 1, 2], [11, 12]], [[ 2, 3], [12, 13]]], [[[10, 11], [20, 21]], [[11, 12], [21, 22]], [[12, 13], [22, 23]]]])
可以明确指定轴:
>>> v = sliding_window_view(x, 3, 0) >>> v.shape (1, 4, 3) >>> v array([[[ 0, 10, 20], [ 1, 11, 21], [ 2, 12, 22], [ 3, 13, 23]]])
同一个轴可以被多次使用.在这种情况下,每次使用都会减少相应的原始维度:
>>> v = sliding_window_view(x, (2, 3), (1, 1)) >>> v.shape (3, 1, 2, 3) >>> v array([[[[ 0, 1, 2], [ 1, 2, 3]]], [[[10, 11, 12], [11, 12, 13]]], [[[20, 21, 22], [21, 22, 23]]]])
结合步进切片(::step),这可以用来获取跳过元素的滑动视图:
>>> x = np.arange(7) >>> sliding_window_view(x, 5)[:, ::2] array([[0, 2, 4], [1, 3, 5], [2, 4, 6]])
或通过多个元素移动的视图
>>> x = np.arange(7) >>> sliding_window_view(x, 3)[::2, :] array([[0, 1, 2], [2, 3, 4], [4, 5, 6]])
sliding_window_view
的一个常见应用是计算运行统计数据.最简单的例子是 移动平均:>>> x = np.arange(6) >>> x.shape (6,) >>> v = sliding_window_view(x, 3) >>> v.shape (4, 3) >>> v array([[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]]) >>> moving_average = v.mean(axis=-1) >>> moving_average array([1., 2., 3., 4.])
请注意,滑动窗口方法通常**不是**最优的(见注释).