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,) .

subokbool, 可选

如果为 True,则将传递子类,否则返回的数组将被强制为基类数组(默认).

可写bool, 可选

如果为 true,则允许写入返回的视图. 默认值为 false,因为应谨慎使用:返回的视图包含同一内存多次,所以写入一个位置会导致其他位置发生更改.

返回:
视图ndarray

数组的滑动窗口视图. 滑动窗口维度插入到末尾,并且原始维度根据滑动窗口的大小进行修剪. 也就是说, view.shape = x_shape_trimmed + window_shape ,其中 x_shape_trimmedx.shape ,每个条目都减去比相应窗口大小小 1 的值.

参见

lib.stride_tricks.as_strided

一个更低级且不太安全的例程,用于从自定义形状和步长创建任意视图.

broadcast_to

将数组广播到给定的形状.

注释

对于许多应用来说,使用滑动窗口视图可能很方便,但可能非常慢. 通常存在专门的解决方案,例如:

粗略估计,输入大小为 N ,窗口大小为 W 的滑动窗口方法的缩放比例为 O(NW) ,而通常特殊算法可以达到 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 的一个常见应用是计算运行统计信息. 最简单的例子是 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.])

请注意,滑动窗口方法通常不是最佳的(请参阅注释).