當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。