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, optional
如果为 True,则子类将被透传,否则返回的数组将被强制为基类数组(默认)。
- writeablebool,可选
为 True 时,允许写入返回的视图。默认为 False,因为应谨慎使用:返回的视图包含多个相同的内存位置,因此写入一个位置将导致其他位置发生更改。
- 返回:
- viewndarray
数组的滑动窗口视图。滑动窗口维度插在末尾,原始维度根据滑动窗口的大小进行修剪。也就是说,
view.shape = x_shape_trimmed + window_shape,其中x_shape_trimmed是x.shape,每一项都比相应的窗口大小减去一。
另请参阅
lib.stride_tricks.as_strided一个更底层、不太安全的例程,用于从自定义形状和步长创建任意视图。
broadcast_to将数组广播到给定的形状。
备注
警告
此函数创建具有重叠内存的视图。当
writeable=True时,写入视图将修改原始数组,并可能影响多个视图位置。请参阅下面的示例和关于复制与视图之间差异的指南。对于许多应用而言,使用滑动窗口视图可能很方便,但可能非常慢。通常存在专门的解决方案,例如:
scipy.ndimage 中
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.])
下面的两个示例演示了
writeable=True的效果。创建具有默认
writeable=False的视图然后写入会引发错误。>>> v = sliding_window_view(x, 3) >>> v[0,1] = 10 Traceback (most recent call last): ... ValueError: assignment destination is read-only
创建具有
writeable=True的视图然后写入会更改原始数组和多个视图位置。>>> x = np.arange(6) # reset x for the second example >>> v = sliding_window_view(x, 3, writeable=True) >>> v[0,1] = 10 >>> x array([ 0, 10, 2, 3, 4, 5]) >>> v array([[ 0, 10, 2], [10, 2, 3], [ 2, 3, 4], [ 3, 4, 5]])
请注意,滑动窗口方法通常不是最优的(请参阅说明)。