当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python dask.array.lib.stride_tricks.sliding_window_view用法及代码示例


用法:

dask.array.lib.stride_tricks.sliding_window_view(x, window_shape, axis=None)

使用给定的窗口形状在数组中创建一个滑动窗口视图。

此文档字符串是从 dask.array.numpy_compat.sliding_window_view 复制而来的。

可能存在与 Dask 版本的一些不一致之处。

也称为滚动或移动窗口,窗口在数组的所有维度上滑动,并在所有窗口位置提取数组的子集。

参数

xarray_like

用于创建滑动窗口视图的数组。

window_shapeint 或 int 的元组

参与滑动窗口的每个轴上的窗口大小。如果 axis 不存在,则长度必须与输入数组维数相同。单个整数 i 被视为元组 (i,)

axisint 或 int 的元组,可选

沿其应用滑动窗口的轴。默认情况下,滑动窗口应用于所有轴,window_shape[i] 将引用 x 的轴 i。如果 axis 作为 tuple of int , window_shape[i] 给出,将参考 x 的轴 axis[i] 。单个整数 i 被视为元组 (i,)

subokbool,可选(在 Dask 中不支持)

如果为 True,则子类将为 passed-through,否则返回的数组将被强制为 base-class 数组(默认)。

writeablebool,可选(在 Dask 中不支持)

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

返回

viewndarray

阵列的滑动窗口视图。最后插入滑动窗口尺寸,并根据滑动窗口的大小对原始尺寸进行修剪。即 view.shape = x_shape_trimmed + window_shape ,其中 x_shape_trimmedx.shape ,每个条目都比相应的窗口大小小一。

注意

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

  • scipy.signal.fftconvolve
  • 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 的一个常见应用是运行统计的计算。最简单的例子是 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.])

请注意,滑动窗口方法通常是不是最佳(见注释)。

相关用法


注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.array.lib.stride_tricks.sliding_window_view。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。