Say I have a matrix like Matrix = [[A11, A12, A13, A14], [A21, A22, A23, A24], [A31, A32, A33, A34], [A41, A42, A43, A44]], and suppose I want to convert it to a block matrix [[A,B], [C,D]], where A = [[A11, A12], [A21, A22]] B = [[A13, A14], [A23, A24]] C = [[A31, A32], [A41, A42]] D = [[A33, A34], [A43, A44]]. What do I need to type to quickly extract the matrices A, B, C, and D?
Without using loops, you can reshape your array (and reorder the dimensions with moveaxis): A, B, C, D = np.moveaxis(Matrix.reshape((2,2,2,2)), 1, 2).reshape(-1, 2, 2)  Or: (A, B), (C, D) = np.moveaxis(Matrix.reshape((2,2,2,2)), 1, 2)  For a generic answer on an arbitrary shape: x, y = Matrix.shape (A, B), (C, D) = np.moveaxis(Matrix.reshape((2, x//2, 2, y//2)), 1, 2)  Output: # A array([['A11', 'A12'], ['A21', 'A22']], dtype='<U3') # B array([['A13', 'A14'], ['A23', 'A24']], dtype='<U3') # C array([['A31', 'A32'], ['A41', 'A42']], dtype='<U3') # D array([['A33', 'A34'], ['A43', 'A44']], dtype='<U3') 