2017-03-16 70 views
9

可以說我有一個數組:如何在固定大小的塊中分割具有或不具有重疊的numpy數組?

>>> arr = np.array(range(9)).reshape(3, 3) 
>>> arr 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

我想創建一個函數f(arr, shape=(2, 2)),是以陣列和形狀,並拆分陣列到給定的形狀的塊而不填充。因此,必要時可以通過重疊某些部分。例如:

>>> f(arr, shape=(2, 2)) 
array([[[[0, 1], 
     [3, 4]], 

     [[1, 2], 
     [4, 5]]], 

     [[[3, 4], 
     [6, 7]], 

     [[4, 5], 
     [7, 8]]]]) 

我設法創建輸出以上與np.lib.stride_tricks.as_strided(arr, shape=(2, 2, 2, 2), strides=(24, 8, 24, 8))。但我不知道如何將其推廣到所有數組和所有塊大小。

優選地,對於3D陣列。

如果不需要重疊,應該避免這種情況。又如:

>>> arr = np.array(range(16).reshape(4,4) 
>>> arr 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 
>>> f(arr, shape=(2,2)) 
array([[[[0, 1], 
     [4, 5]], 

     [[2, 3], 
     [6, 7]]], 

     [[[8, 9], 
     [12, 13]], 

     [[10, 11], 
     [14, 15]]]]) 

skimage.util.view_as_blocks接近,但需要在陣列和塊的形狀是兼容的。

回答

8

有一個內置在scikit-image as view_as_windows整整這樣做 -

from skimage.util.shape import view_as_windows 

view_as_windows(arr, (2,2)) 

採樣運行 -

In [40]: arr 
Out[40]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

In [41]: view_as_windows(arr, (2,2)) 
Out[41]: 
array([[[[0, 1], 
     [3, 4]], 

     [[1, 2], 
     [4, 5]]], 


     [[[3, 4], 
     [6, 7]], 

     [[4, 5], 
     [7, 8]]]]) 

對於第二部分,利用其表弟來自同一個家庭/模塊view_as_blocks -

from skimage.util.shape import view_as_blocks 

view_as_blocks(arr, (2,2)) 
+0

我應該更清楚一些,如果有必要,我只希望它們重疊。我將提供另一個例子。謝謝。 – V1ncam

+0

@Divakar說我有一個A.shape =(n,m,n)的數組A,我想拉動A [i,j,k]周圍的26個元素(即A [i + 1,j,k ],A [i-1,j + 1,k-1]等) 我想view_as_blocks(A,(3,3,3))會接近我想要的 - 但是如何修復A [i,j,k]是塊的中心元素而不是角元素?我希望這是有道理的。請問我的數組只是view_as_blocks(A,(3,3,3))[i + 1,j + 1,k + 1]? – kevinkayaks

相關問題