Разделение матрицы на подматрицы

Вводится N - размер матрицы, K - размер подматриц.
Далее вводится матрица
Допустим N = 3, K = 2

Наша матрица N*N

1 2 1
1 1 2
1 1 1

Все подматрицы размера K*K:

[1 2
 1 1]

[2 1
 1 2]

[1 1
 1 1]

[1 2
 1 1]

Как сделать такое же нахождение подматриц? От чего отталкиваться? Единственное что сделал - создание трёхмерного массива матриц k*k заполненных нулями.


Ответы (2 шт):

Автор решения: Zhihar

если в лоб, то так:

matrix = [[1, 2, 3, 'a'], [4, 5, 6, 'b'], [7, 8, 9, 'c'], [10, 11, 12, 'd']]
size = (3, 2)

for j in range(len(matrix) - size[1] + 1):
    for i in range(len(matrix[j]) - size[0] + 1):
        for y in range(size[1]):
            line = []
            for x in range(size[0]):
                line.append(matrix[j + y][i + x])
            print(line)
        print()

грубо говоря вам надо пройтись по матрице так чтобы 1 элемент подматрицы был в диапазоне: matrix_width - submatrix_width, matrix_height - submatrix_height

а дальше используя координаты первого элемента находите все остальные элементы подматрицы в матрице

или если это записать на уровне формулы, то:

submatrix[x][y] = matrix[i + x][j + y]

где (i, j) - координаты первого (левый верхний) элемента подматрицы в матрице

P.S.

код можно чуть-чуть упростить (для любителей разврата):

[[[print([matrix[j + y][i + x] for x in range(size[0])]) for y in range(size[1])] + [print()] for i in range(len(matrix[j]) - size[0] + 1)] for j in range(len(matrix) - size[1] + 1)]
→ Ссылка
Автор решения: GrAnd

Если исходную матрицу представить в виде планарного списка, то решение довольно простое и укладывается в одну строку.

matrix = [1, 2, 1,
          1, 1, 2,
          1, 1, 1]

N = int(len(matrix)**0.5)
K = N - 1

k_matrixes = [sum((matrix[rr*N+c:rr*N+c+K] for rr in range(r,r+K)), []) for r in range(N-K+1) for c in range(N-K+1)]

print(k_matrixes)
[[1, 2, 1, 1], [2, 1, 1, 2], [1, 1, 1, 1], [1, 2, 1, 1]]
→ Ссылка