簡體   English   中英

將 2d numpy 數組分成 nxn 個塊

[英]separating 2d numpy array into nxn chunks

如何將 2D numpy數組分成 nxn 個塊?

例如,以下形狀數組(4,4)

arr = [[1,2,3,4],
       [5,6,7,8],
       [9,10,11,12],
       [13,14,15,16]]

通過使用不同的(2x2)數組進行子采樣,轉換為形狀為(4,2,2)的此數組:

new_arr = [[[1,2],
            [5,6]],
           [[3,4],
            [7,8]],
           [[9,10],
            [13,14]],
           [[11,12],
            [15,16]]]

您可以執行以下操作,並將其調整為您的陣列:

import numpy as np

arr = [[1,2,3,4],
       [5,6,7,8],
       [9,10,11,12],
       [13,14,15,16]]

arr_new = np.array([[arr[i][j:j+2], arr[i+1][j:j+2]] for j in range(len(arr[0])-2) for i in range(len(arr)-2)])
print(arr_new)
print(arr_new.shape)

這給出了以下 output:

[[[ 1  2]
  [ 5  6]]

 [[ 5  6]
  [ 9 10]]

 [[ 2  3]
  [ 6  7]]

 [[ 6  7]
  [10 11]]]
(4, 2, 2)

您可以使用hsplit()vsplit()方法來實現上述目的。

import numpy as np

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

ls1,ls2 = np.hsplit(arr, 2)
ls1 = np.vsplit(ls1,2)
ls2 = np.vsplit(ls2,2)
ls = ls1 + ls2
result = np.array(ls)

print(result)

>>> 
 [[[ 1  2]
  [ 5  6]]

 [[ 9 10]
  [13 14]]

 [[ 3  4]
  [ 7  8]]

 [[11 12]
  [15 16]]]

print(result.tolist())

>>> [[[1, 2], [5, 6]], [[9, 10], [13, 14]], [[3, 4], [7, 8]], [[11, 12], [15, 16]]]

您可以使用np.vsplit將數組垂直拆分為多個子數組。 同樣,您可以使用np.hsplit將數組水平拆分為多個子數組。 為了更好地理解這一點,請檢查使用np.vsplitnp.hsplit方法的廣義resample function。

用這個:

def ressample(arr, N):
    A = []
    for v in np.vsplit(arr, arr.shape[0] // N):
        A.extend([*np.hsplit(v, arr.shape[0] // N)])
    return np.array(A)

示例 1:給定的 2D 數組的形狀為 4x4,我們希望將其子采樣到形狀為 2x2 的塊中。

arr = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8],
                [9, 10, 11, 12],
                [13, 14, 15, 16]])  
print(ressample(arr, 2)) #--> chunk size 2

Output 1:

[[[ 1  2]
  [ 5  6]]

 [[ 3  4]
  [ 7  8]]

 [[ 9 10]
  [13 14]]

 [[11 12]
  [15 16]]]

示例 2:考慮給定的二維數組包含 8 行和 8 列。 現在我們將這個數組二次采樣成 4x4 形狀的塊。

arr = np.random.randint(0, 10, 64).reshape(8, 8)   
print(ressample(arr, 4)) #--> chunck size 4

樣品 Output 2:

[[[8 3 7 5]
  [7 2 6 1]
  [7 9 2 2]
  [3 1 8 8]]

 [[2 0 3 2]
  [2 9 0 8]
  [2 6 3 9]
  [2 4 4 8]]

 [[9 9 1 8]
  [9 1 5 0]
  [8 5 1 2]
  [2 7 5 1]]

 [[7 8 9 6]
  [9 0 9 5]
  [8 9 8 3]
  [7 3 6 3]]]

不需要拆分或任何東西; 同樣可以通過重塑和重新排序軸來實現。

result = np.swapaxes(arr.reshape(2, 2, 2, 2), 1, 2).reshape(-1, 2, 2)

將 (N, N) 數組划分為 (n, n) 塊基本上也是一個滑動 window 操作,帶有 (n, n) window 和 n 步長。

from numpy.lib.stride_tricks import sliding_window_view

result = sliding_window_view(arr, (2, 2))[::2, ::2].reshape(-1, 2, 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM