'2 different ways to index 3D array in Numpy?

I have a 3-D array with dimension of (14,3,5), which correspond to (event, color, taste). If I want to select all event's second color option and third taste option. Could someone tell me which is the correct format?

[:,2,3] vs [:,2][:,3]

Are they the same, or different? If they are different, how are they different?



Solution 1:[1]

Do a test:

In [256]: arr = np.arange(2*3*5).reshape(2,3,5)
In [257]: arr
Out[257]: 
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]]])

One way:

In [258]: arr[:,2,3]
Out[258]: array([13, 28])

The other is evaluated in 2 steps:

In [259]: arr[:,2]
Out[259]: 
array([[10, 11, 12, 13, 14],
       [25, 26, 27, 28, 29]])
In [260]: arr[:,2][:,3]
Out[260]: array([13, 28])

The [:,3] is applied to the result of the [:,2]. Each [] is translated by the interpreter into a __getitem__() call (or a __setitem__ if followed by a =). [:,2,3] is one just call, __getitem__((slice(None),2,3)).

With scalar indices like this, they are the same.

But what if one (or both) index is a list or array?

In [261]: arr[:,[1,2],3]
Out[261]: 
array([[ 8, 13],
       [23, 28]])
In [262]: arr[:,[1,2]]
Out[262]: 
array([[[ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29]]])
In [263]: arr[:,[1,2]][:,3]
Traceback (most recent call last):
  Input In [263] in <cell line: 1>
    arr[:,[1,2]][:,3]
IndexError: index 3 is out of bounds for axis 1 with size 2

In [264]: arr[:,[1,2]][:,:,3]
Out[264]: 
array([[ 8, 13],
       [23, 28]])

At least you are doing the common novice mistake of attempting:

In [265]: arr[:][2][3]
Traceback (most recent call last):
  Input In [265] in <cell line: 1>
    arr[:][2][3]
IndexError: index 2 is out of bounds for axis 0 with size 2

In the long run you need to read and understand (most of)

https://numpy.org/doc/stable/user/basics.indexing.html

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1