How does numpy reshape works?

Question:

I have data in a numpy array:

a = np.arange(100)
a = a.reshape((20,5))

When I type

a[:10]

it returns

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, 36, 37, 38, 39],
       [40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49]])

Now i decided to reshape the array into 3d array.

b = a.reshape((5,4,5))

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, 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],
    [90, 91, 92, 93, 94],
    [95, 96, 97, 98, 99]]])

How do I slice b to that I obtain the values like a[:10]?
I tried

b[:10,0,:5]
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [20, 21, 22, 23, 24],
       [30, 31, 32, 33, 34],
       [40, 41, 42, 43, 44],
       [50, 51, 52, 53, 54],
       [60, 61, 62, 63, 64],
       [70, 71, 72, 73, 74],
       [80, 81, 82, 83, 84],
       [90, 91, 92, 93, 94]])

But its not correct.
Thank you in advance!

Asked By: dnth

||

Answers:

When you use b = a.reshape((5,4,5)) you just create a different view on the same data used by the array a. (ie changes to the elements of a will appear in b). reshape() does not copy data in this case, so it is a very fast operation. Slicing b and slicing a accesses the same memory, so there shouldn’t be any need for a different syntax for the b array (just use a[:10]). If you have created a copy of the data, perhaps with np.resize(), and discarded a, just reshape b: b.reshape((20,5))[:10].

Answered By: xnx

By reshaping (20,5) to (5,4,5), there’s no way you can pull out the 1st half of the values. You can’t split those 5 rows into 2 even groups:

In [9]: b[:2]
Out[9]: 
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, 36, 37, 38, 39]]])

In [10]: b[:3]
Out[10]: 
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, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

The last row of a[:10] is in the middle of b[3,:,:].

Note that b[:2] is (2,4,5), 8 rows of a, grouped into 2 sets of 4.

Now if you’d done c=a.reshape(4,5,5), then c[:2] would have those same 10 rows – in 2 sets of 5. And c[:2].reshape(10,-1) will look just like a[:10].

Answered By: hpaulj

There could be a programmatic way to get what you want, but not a python slice.

It is important to understand what every component in the shape tells us about the arrangement. I like to think in terms of vectors.

Let’s talk about the shape (20, 5) – this would mean, I have 20 vectors where every vector has 5 elements.

For the shape (5, 4, 5) – this would mean, I have 5 vectors, where each vector again has 4 vectors where every vector within has 5 elements.

This might sound complicated but with some deliberation, this could be understood.

Coming to your question, by a[:10] you want to retrieve the first 10 rows where each row should be a vector containing 5 elements but using a shape of (5, 4, 5).
This is only possible if you retrieve the first 4 vectors from 1st vector of the leftmost dimension (5), next 4 vectors from the next vector and next 2 from the 3rd.

Python slicing might not be the best tool to achieve this.

Answered By: ankitgupta5294
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.