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.