Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

numpy.block issue with reshaping

I have been stuck on this problem for a while now and would really appreciate if someone could give any ideas?

I have a numpy array, say, A, of shape: (3, 3, 3, 3). I want to basically make it a 2D array, B of shape: (9, 9) while preserving the contents of A in a natural block order, i.e. A[0][0][:][:] is basically a 3 x 3 sub-matrix, which should also appear in the top-left portion of B. Similarly, A[2][2][:][:] should appear in the bottom-right portion of B and so on. I have attached the example, to clarify. original array, A:

array([[[[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]],

        [[ 1,  1,  1],
         [ 1,  1,  1],
         [ 1,  1,  1]],

        [[ 2,  2,  2],
         [ 2,  2,  2],
         [ 2,  2,  2]]],


       [[[-1, -1, -1],
         [-1, -1, -1],
         [-1, -1, -1]],

        [[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]],

        [[ 1,  1,  1],
         [ 1,  1,  1],
         [ 1,  1,  1]]],


       [[[-2, -2, -2],
         [-2, -2, -2],
         [-2, -2, -2]],

        [[-1, -1, -1],
         [-1, -1, -1],
         [-1, -1, -1]],

        [[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]]]])

and desired array, B:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

array([[ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0]])

>Solution :

You input is ambiguous. I can reproduce it using:

a = np.repeat(np.array([0,1,2,-1,0,1,-2,-1,0]), 9).reshape(3,3,3,3)

And then, swapping axes and reshaping gives:

a.swapaxes(1,2).reshape(9,9)

array([[ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0]])

But this could be incorrect depending on how you want each 3×3 block to behave when becoming another 3×3 block.

Given a range input 0->80 (a = np.arange(3**4).reshape(3,3,3,3)):

array([[[[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8]],

        [[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]],
...

This would give:

array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
       [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
       [ 6,  7,  8, 15, 16, 17, 24, 25, 26],
       [27, 28, 29, 36, 37, 38, 45, 46, 47],
       [30, 31, 32, 39, 40, 41, 48, 49, 50],
       [33, 34, 35, 42, 43, 44, 51, 52, 53],
       [54, 55, 56, 63, 64, 65, 72, 73, 74],
       [57, 58, 59, 66, 67, 68, 75, 76, 77],
       [60, 61, 62, 69, 70, 71, 78, 79, 80]])

Is this what you want?

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading