lib.stride_tricks.
sliding_window_view
在具有给定窗口形状的阵列中创建滑动窗口视图。
也称为滚动或移动窗口,该窗口在数组的所有维度上滑动,并在所有窗口位置提取数组的子集。
1.20.0 新版功能.
用于创建滑动窗口视图的数组。
参与滑动窗口的每个轴上的窗口大小。如果 axis 不存在,长度必须与输入数组维数相同。单整数 i 就好像它们是元组一样 (i,) .
应用滑动窗口的一个或多个轴。默认情况下,滑动窗口应用于所有轴和轴 window_shape[i] 将参考轴 i 属于 x .如果 axis 作为一个 tuple of int , window_shape[i] 将参考轴 axis[i] 属于 x . 单整数 i 就好像它们是元组一样 (i,) .
如果为True,则传递子类,否则返回的数组将强制为基类数组(默认值)。
如果为true,则允许写入返回的视图。默认值为false,因为应该谨慎使用:返回的视图多次包含相同的内存位置,因此写入一个位置将导致其他位置发生更改。
阵列的滑动窗口视图。滑动窗口尺寸标注将插入到末端,并根据滑动窗口的大小修剪原始尺寸标注。也就是说, view.shape = x_shape_trimmed + window_shape 在哪里 x_shape_trimmed 是 x.shape 每一个条目都比相应的窗口小一个。
view.shape = x_shape_trimmed + window_shape
x_shape_trimmed
x.shape
参见
lib.stride_tricks.as_strided
从自定义形状和步幅创建任意视图的较低级别和较不安全的例程。
broadcast_to
将数组广播到给定形状。
笔记
对于许多应用程序,使用滑动窗口视图可能很方便,但可能非常慢。通常存在专门的解决方案,例如:
scipy.signal.fftconvolve
中的过滤函数 scipy.ndimage
scipy.ndimage
移动窗口功能由提供 bottleneck .
作为粗略估计,输入大小为的滑动窗口方法 N 还有一扇 W 将缩放为 O(N*W) 其中经常可以实现一种特殊的算法 O(N) . 这意味着窗口大小为100的滑动窗口变体可能比更专业的版本慢100倍。
然而,对于较小的窗口大小,当没有自定义算法存在时,或者作为原型和开发工具,此函数可以是一个很好的解决方案。
实例
>>> 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 is the calculation of running statistics. The simplest example is the moving average :
>>> 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.])
请注意,滑动窗口方法通常是 not 最佳(见注释)。