Как получить подматрицу m * n из более крупной матрицы в numpy - PullRequest
0 голосов
/ 18 мая 2018

Наткнулся на это, пытаясь решить вопрос, связанный с судоку.

Мне нужно вернуть все матрицы 3 * 3 из большей матрицы 9 * 9.

Есть ли прямой способ сделать это в numpy?

Мой текущий подход предполагает выполнение двух разбиений - сначала по горизонтали, а затем по вертикали для каждого элемента в списке, полученном из предыдущего разбиения

grid= np.array([[5,3,4,6,7,8,9,1,2],
     [6,7,2,1,9,5,3,4,8],
     [1,9,8,3,3,2,5,6,7],
     [8,5,9,7,6,1,4,2,3],
     [4,2,6,8,5,3,7,9,1],
     [7,1,3,9,2,4,8,5,6],
     [9,6,1,5,3,7,2,8,4],
     [2,8,7,4,1,9,6,3,5],
     [3,4,5,2,8,6,1,7,9]])


for i in np.split(grid,3):
    for t in (np.hsplit(i,3)):
        print(t)

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Не уверен, что это кратчайший путь, но вы можете получить результат с несколькими изменениями и транспонированием:

import numpy as np

a = np.arange(81).reshape((9, 9))
print(a)
# [[ 0  1  2  3  4  5  6  7  8]
#  [ 9 10 11 12 13 14 15 16 17]
#  [18 19 20 21 22 23 24 25 26]
#  [27 28 29 30 31 32 33 34 35]
#  [36 37 38 39 40 41 42 43 44]
#  [45 46 47 48 49 50 51 52 53]
#  [54 55 56 57 58 59 60 61 62]
#  [63 64 65 66 67 68 69 70 71]
#  [72 73 74 75 76 77 78 79 80]]
b = np.transpose(np.transpose(np.transpose(a.reshape((3, 3, 9)), (1, 0, 2)).reshape((3, -1))).reshape((9, 3, 3)), (0, 2, 1))
print(b[0])
# [[ 0  1  2]
#  [ 9 10 11]
#  [18 19 20]]
print(b[1])
# [[ 3  4  5]
#  [12 13 14]
#  [21 22 23]]
# ...
0 голосов
/ 18 мая 2018

Вы можете получить мозаику, регулируя форму и шаг массива:

import numpy as np

x = np.arange(81).reshape(9, 9)

r = x.strides[0]
c = x.strides[1]

y = np.lib.stride_tricks.as_strided(x, shape=(3, 3, 3, 3), strides=(r*3, c*3, r, c))
print(y[1, 1])
# [[30 31 32]
#  [39 40 41]
#  [48 49 50]]
  1. С помощью shape=(3,3, 3,3) мы указываем желаемую форму вывода: 3x3 под-массивы размером 3x3каждая.

  2. С помощью strides= мы указываем, как изменяется адрес памяти при переходе от одного элемента к следующему вдоль измерения.r*3, c*3: подсетки расположены с шагом в три строки и столбца.r, c: интервал между элементами в подсетке такой же, как и в исходном массиве.

Если вы хотите простой список подмассивов вместо двумерного расположения, вы можете сделать y.reshape(9, 3, 3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...