разделение массива 2d numpy на куски nxn - PullRequest
0 голосов
/ 08 апреля 2020

Как бы вы разделили массив 2D numpy на nxn?

Например, следующий массив формы (4,4) :

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

Преобразуется в этот массив формы (4,2,2) путем подвыборки с другим массивом (2x2) :

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

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

Вы можете использовать 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]]]

0 голосов
/ 08 апреля 2020

Вы можете использовать np.vsplit, чтобы разбить массив на несколько подмассивов по вертикали. Точно так же вы можете использовать np.hsplit , чтобы разбить массив на несколько подмассивов по горизонтали. Чтобы лучше понять это, рассмотрим обобщенную функцию resample, которая использует методы np.vsplit и np.hsplit.

Используйте это:

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

Выход 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

Пример вывода 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]]]
0 голосов
/ 08 апреля 2020

Вы можете сделать следующее и настроить его под свой массив:

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)

Это даст следующий вывод:

[[[ 1  2]
  [ 5  6]]

 [[ 5  6]
  [ 9 10]]

 [[ 2  3]
  [ 6  7]]

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