Example of how to split a 2D array into a list of smaller 2D arrays in python with numpy:

### Create a 2d array

Let's create for example a 2d array of size (m,n) = (9,9)

`import numpy as np`

`x = np.arange(81)`

`x = x.reshape(9,9)`

`print(x)`

returns

`[[ 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]]`

### Split the 2d array into a list of 3 by 3 arrays

To split an array into smaller 2d arrays a straightforward solution is to use numpy.split.

For example let's split first the array along the axis 0:

`l = np.array_split(x,3,axis=0)`

note that numpy.split returns a list

`print(type(l))`

`print(len(l))`

gives

`<class 'list'>`

and

`3`

Now just split again the arrays but along the axis 1:

`new_l = []`

`for a in l:`

`l = np.array_split(a,3,axis=1)`

`new_l += l`

then

`print(new_l)`

`print(len(new_l))`

returns

`[array([[ 0, 1, 2],`

`[ 9, 10, 11],`

`[18, 19, 20]]),`

`array([[ 3, 4, 5],`

`[12, 13, 14],`

`[21, 22, 23]]),`

`array([[ 6, 7, 8],`

`[15, 16, 17],`

`[24, 25, 26]]),`

`array([[27, 28, 29],`

`[36, 37, 38],`

`[45, 46, 47]]),`

`array([[30, 31, 32],`

`[39, 40, 41],`

`[48, 49, 50]]),`

`array([[33, 34, 35],`

`[42, 43, 44],`

`[51, 52, 53]]),`

`array([[54, 55, 56],`

`[63, 64, 65],`

`[72, 73, 74]]),`

`array([[57, 58, 59],`

`[66, 67, 68],`

`[75, 76, 77]]),`

`array([[60, 61, 62],`

`[69, 70, 71],`

`[78, 79, 80]])]`

and

`9`

### Another example using numpy.split

Another example with an array of size (10,9)

`import numpy as np`

`x = np.arange(90)`

`x = x.reshape(10,9)`

`print(x)`

gives

`[[ 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]`

`[81 82 83 84 85 86 87 88 89]]`

in that case the slit along the axis = 0 :

`l = np.array_split(x,3,axis=0)`

will returns 3 arrays of size (4,9) (3,9) (3,9) since n = 10 = 4 + 3 + 3:

`[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]]), array([[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]]), array([[63, 64, 65, 66, 67, 68, 69, 70, 71],`

`[72, 73, 74, 75, 76, 77, 78, 79, 80],`

`[81, 82, 83, 84, 85, 86, 87, 88, 89]])]`

`new_l = []`

`for a in l:`

`l = np.array_split(a,3,axis=1)`

`new_l += l`

gives

`[array([[ 0, 1, 2],`

`[ 9, 10, 11],`

`[18, 19, 20],`

`[27, 28, 29]]), array([[ 3, 4, 5],`

`[12, 13, 14],`

`[21, 22, 23],`

`[30, 31, 32]]), array([[ 6, 7, 8],`

`[15, 16, 17],`

`[24, 25, 26],`

`[33, 34, 35]]), array([[36, 37, 38],`

`[45, 46, 47],`

`[54, 55, 56]]), array([[39, 40, 41],`

`[48, 49, 50],`

`[57, 58, 59]]), array([[42, 43, 44],`

`[51, 52, 53],`

`[60, 61, 62]]), array([[63, 64, 65],`

`[72, 73, 74],`

`[81, 82, 83]]), array([[66, 67, 68],`

`[75, 76, 77],`

`[84, 85, 86]]), array([[69, 70, 71],`

`[78, 79, 80],`

`[87, 88, 89]])]`

Note that in this example the list of smaller 2d arrays do not have the same size since it is not possible to decompose a (10,9) array into (3,3) arrays.