En números, ¿cómo listar eficientemente todas las submatrices de tamaño fijo?

Tengo una matriz NxM arbitraria, por ejemplo:

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 

Quiero obtener una lista de todas las submatrices 3×3 en esta matriz:

 1 2 3 2 3 4 0 1 2 7 8 9 ; 8 9 0 ; ... ; 6 7 8 3 4 5 4 5 6 2 3 4 

Puedo hacer esto con dos bucles nesteds:

 rows, cols = input_matrix.shape patches = [] for row in np.arange(0, rows - 3): for col in np.arange(0, cols - 3): patches.append(input_matrix[row:row+3, col:col+3]) 

Pero para una matriz de entrada grande, esto es lento. ¿Hay una manera de hacerlo más rápido con numpy?

He mirado np.split , pero eso me da submatrices no superpuestas, mientras que quiero todas las submatrices posibles, independientemente de la superposición.

Quieres una vista de ventana:

 from numpy.lib.stride_tricks import as_strided arr = np.arange(1, 25).reshape(4, 6) % 10 sub_shape = (3, 3) view_shape = tuple(np.subtract(arr.shape, sub_shape) + 1) + sub_shape arr_view = as_strided(arr, view_shape, arr.strides * 2 arr_view = arr_view.reshape((-1,) + sub_shape) >>> arr_view array([[[[1, 2, 3], [7, 8, 9], [3, 4, 5]], [[2, 3, 4], [8, 9, 0], [4, 5, 6]], ... [[9, 0, 1], [5, 6, 7], [1, 2, 3]], [[0, 1, 2], [6, 7, 8], [2, 3, 4]]]]) 

Lo bueno de hacerlo así es que no está copiando ningún dato, simplemente está accediendo a los datos de su matriz original de una manera diferente. Para matrices grandes, esto puede resultar en un gran ahorro de memoria.