Как из матрицы создать n других матриц с размерностью k*k?

У меня есть матрица размером 3*3. Это массив numpy.

Вот пример:

[[30, 90,   80],
 [93,  4,   92],
 [72,  2,   37]]

Из этой матрицы я хочу создать другие матрицы размером 2*2, двигаясь с шагом 1 в правую сторону и вниз. Т. е. должны получиться следующие матрицы:

[[30, 90],
 [93,  4]]

[[90, 80],
 [4,  92]]

[[93, 4],
 [72, 2]]

[[4, 92],
 [2, 37]]

В реальной задаче, входная матрица размером 20 * 20 и сгенерированные матрицы должны быть 5*5.

Я хочу понять, как можно реализовать эту логику на более простом примере, чтобы потом использовать логику для решения задачи с матрицами размерности побольше. Как я могу с матрицы размерностью 3 * 3, получить матрицы 2 * 2 согласно логике описанной выше?

Спасибо


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

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

Самый простой вариант:

import numpy as np

m = np.linspace(1,9,9).reshape([3,3])

Исходная матрица:

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

Разбиваем:

for i in range(1, m.shape[0]):
    for j in range(1, m.shape[0]):
        print(m[i-1:i+1,j-1:j+1])

На выходе:

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

Предупреждение:

Имейте в виду, что если вы захотите присвоить полученные срезы переменным, не забудьте воспользоваться методом copy().

→ Ссылка