Home > Software engineering >  Numpy: Why advance indexing of > 2 dimensional arrays with a list and numpy array give different
Numpy: Why advance indexing of > 2 dimensional arrays with a list and numpy array give different

Time:06-26

I have 3-dimensional numpy array

a = np.array([
  [
    [1, 3],
    [0, 2]
  ], 
  [
    [2, 1],
    [4, 2]
  ]
], dtype=np.int32)

And I want to get the elements using the indices [0, 1, 1], and [1, 0, 1]

which I expect to give me:

[2, 1]

If I index with list, it returns the result I wanted, but if I index with Numpy array, it gives different results, why is that?

>>> indices = [[0, 1], [1, 0], [1, 1]]
>>> indices_arr = np.array(indices, dtype=np.int32)

>>> a[indices]
# OUTPUT
# array([2, 1], dtype=int32

>>> a[indices_arr]
# OUTPUT
'''
array([[[[1, 3],
         [0, 2]],

        [[2, 1],
         [4, 2]]],


       [[[2, 1],
         [4, 2]],

        [[1, 3],
         [0, 2]]],


       [[[2, 1],
         [4, 2]],

        [[2, 1],
         [4, 2]]]], dtype=int32)
'''

CodePudding user response:

In a current numpy version indices gives a warning:

In [46]: a[indices_arr].shape
Out[46]: (3, 2, 2, 2)

In [47]: a[indices]
C:\Users\paul\AppData\Local\Temp\ipykernel_8668\2035022355.py:1: 
FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; 
use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted 
as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  a[indices]
Out[47]: array([2, 1])

doing the tuple conversion myself:

In [48]: a[tuple(indices)]
Out[48]: array([2, 1])

Your indices_arr is the different result it warns about.

With tuple, we are applying each sublist to a separate dimension of a`:

In [49]: a[[0, 1], [1, 0], [1, 1]]
Out[49]: array([2, 1])

With indices_arr, the array is applied to just the first dimension, hence the (2,) becomes (3,2).

  • Related