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,子類別將被傳遞,否則返回的陣列將被強制為基底類別陣列(預設)。

writeablebool,選用

當為 true 時,允許寫入返回的視圖。預設值為 false,因為應謹慎使用:返回的視圖包含相同的記憶體位置多次,因此寫入一個位置將導致其他位置更改。

返回:
viewndarray

陣列的滑動視窗視圖。滑動視窗維度插入在末尾,原始維度根據滑動視窗的大小進行修剪。也就是說,view.shape = x_shape_trimmed + window_shape,其中 x_shape_trimmedx.shape,每個條目都減少了比對應視窗大小少一的值。

參見

lib.stride_tricks.as_strided

用於從自訂形狀和步幅建立任意視圖的較低階且較不安全的常式。

broadcast_to

將陣列廣播到給定的形狀。

註解

對於許多應用程式來說,使用滑動視窗視圖可能很方便,但可能非常慢。通常存在專門的解決方案,例如

粗略估計,輸入大小為 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.])

請注意,滑動視窗方法通常不是最佳的(請參閱註解)。