I tienen una matriz 2D t
en numpy:Creación de una vista 4D en matriz 2D para dividirlo en células de tamaño fijo
>>> t = numpy.array(range(81)).reshape((9,9))
>>> t
array([[ 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]])
Está indexada por dos números: fila y el índice de columna.
>>> t[2,3]
21
>>> t.shape
(9, 9)
>>> t.strides
(72, 8)
Lo que quiero hacer es divide la matriz en células rectangulares de tamaño fijo, 3 × 3, por ejemplo. Me gustaría evitar la copia de memoria. La forma en que trato de lograr esto es crear una vista en t
con la forma correspondiente y los pasos ((3,3,3,3)
y (216,24,72,8)
respectivamente). De esta forma, los dos primeros índices de la vista significarían la posición de 3 × 3 células en la grilla más grande y las dos últimas significarían la posición del elemento dentro de la celda. Por ejemplo, t[0,1,:,:]
volvería
array([[ 3, 4, 5],
[12, 13, 14],
[21, 22, 23]])
Así que mi pregunta es - cómo crear la vista descrito? ¿Me estoy perdiendo un método más simple? ¿Se puede hacer esto de forma elegante con la sintaxis de corte?
En cuanto al artículo: sí, está absolutamente en lo cierto. Creo que calcularé los pasos necesarios basados en los que ya pasaron array. De esta forma, la rutina de creación de vistas también funcionará en otras vistas 2D. – ulidtko
Mueva la solución 'rollaxis' en la parte superior de la respuesta. – ulidtko