Merging non-overlapping array blocks Merging non-overlapping array blocks numpy numpy

Merging non-overlapping array blocks


Use transpose/swapaxes to swap the second and third axes and then reshape to have the last two axes merged -

B.transpose(0,2,1,3).reshape(-1,B.shape[1]*B.shape[3])B.swapaxes(1,2).reshape(-1,B.shape[1]*B.shape[3])

Sample run -

In [41]: AOut[41]: array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15]])In [42]: B = view_as_blocks(A, block_shape=(2, 2))In [43]: BOut[43]: array([[[[ 0,  1],         [ 4,  5]],        [[ 2,  3],         [ 6,  7]]],       [[[ 8,  9],         [12, 13]],        [[10, 11],         [14, 15]]]])In [44]: B.transpose(0,2,1,3).reshape(-1,B.shape[1]*B.shape[3])Out[44]: array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15]])


This is where you'd better use einops:

from einops import rearrange# that's how you could rewrite view_as_blocksB = rearrange(A, '(x dx) (y dy) -> x y dx dy', dx=2, dy=2)# that's an answer to your questionA = rearrange(B, 'x y dx dy -> (x dx) (y dy)')

See documentation for more operations on images