¿No es posible parchear la matriz 2d en una matriz de subcapa utilizando las funciones disponibles en numpy?

¿No es posible parchear la matriz 2d en la matriz de subcapa utilizando las funciones np.reshape y np.split?

import numpy as np data = np.arange(24).reshape(4,6) print data [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]] answer = np.split(data,(-1,2,2),axis=1) 

La respuesta esperada es:

 answer = [[[ 0 1] [ 6 7]] [[ 2 3] [ 8 9]] [[ 4 5] [10 11]] [[12 13] [18 19]] [[14 15] [20 21]] [[16 17] [22 23]]] 

También podrías hacer lo siguiente:

 >>> data = np.arange(24).reshape(4,6) >>> data_split = data.reshape(2, 2, 3, 2) >>> data_split = np.transpose(data_split, (0, 2, 1, 3)) >>> data_split = data_split.reshape(-1, 2, 2) # this makes a copy >>> data_split array([[[ 0, 1], [ 6, 7]], [[ 2, 3], [ 8, 9]], [[ 4, 5], [10, 11]], [[12, 13], [18, 19]], [[14, 15], [20, 21]], [[16, 17], [22, 23]]]) 

Si realmente desea llamar a split en esta matriz, debería ser bastante sencillo de hacer, pero esta matriz reordenada se comportará como la tupla devuelta por split en la mayoría de las configuraciones.

split no se puede utilizar con varios ejes a la vez. Pero aquí hay una solución usando esta operación dos veces:

 In [1]: import numpy as np In [2]: data = np.arange(24).reshape(4,6) In [3]: chunk = 2, 2 In [4]: tmp = np.array(np.split(data, data.shape[1]/chunk[1], axis=1)) In [5]: answer = np.vstack(np.split(tmp, tmp.shape[1]/chunk[0], axis=1)) In [6]: answer Out[6]: array([[[ 0, 1], [ 6, 7]], [[ 2, 3], [ 8, 9]], [[ 4, 5], [10, 11]], [[12, 13], [18, 19]], [[14, 15], [20, 21]], [[16, 17], [22, 23]]]) 

Sin embargo, prefiero la solución en forma de bloque como lo notó Cyber.