Sun Bear
Sun Bear

Reputation: 8234

What does numpy.ix_() function do and what is the output used for?

Below shows the output from numpy.ix_() function. What is the use of the output? It's structure is quite unique.

import numpy as np

>>> gfg = np.ix_([1, 2, 3, 4, 5, 6], [11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26], [31, 32, 33, 34, 35, 36] )
>>> gfg
(array([[[[1]]],
        [[[2]]],
        [[[3]]],
        [[[4]]],
        [[[5]]],
        [[[6]]]]), 
 
 array([[[[11]],
         [[12]],
         [[13]],
         [[14]],
         [[15]],
         [[16]]]]), 
 
 array([[[[21],
          [22],
          [23],
          [24],
          [25],
          [26]]]]), 
 
 array([[[[31, 32, 33, 34, 35, 36]]]]))

Upvotes: 5

Views: 13980

Answers (2)

Ehsan
Ehsan

Reputation: 12397

According to numpy doc:

Construct an open mesh from multiple sequences. This function takes N 1-D sequences and returns N outputs with N dimensions each, such that the shape is 1 in all but one dimension and the dimension with the non-unit shape value cycles through all N dimensions. Using ix_ one can quickly construct index arrays that will index the cross product. a[np.ix_([1,3],[2,5])] returns the array [[a[1,2] a[1,5]], [a[3,2] a[3,5]]].

numpy.ix_()'s main use is to create an open mesh so that we can use it to select specific indices from an array (specific sub-array). An easy example to understand it is:

Say you have a 2D array of shape (5,5), and you would like to select a sub-array that is constructed by selecting the rows 1 and 3 and columns 0 and 3. You can use np.ix_ to create a (index) mesh so as to be able to select the sub-array as follows in the example below:

a = np.arange(5*5).reshape(5,5)
[[ 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]]

sub_indices = np.ix_([1,3],[0,3])
(array([[1],
       [3]]), array([[0, 3]]))

a[sub_indices]
[[ 5  8]
 [15 18]]

which is basically the selected sub-array from a that is in rows array([[1],[3]]) and columns array([[0, 3]]):

 col 0    col 3
   |        |
   v        v
[[ 0  1  2  3  4]   
 [ 5  6  7  8  9]   <- row 1
 [10 11 12 13 14]
 [15 16 17 18 19]   <- row 3
 [20 21 22 23 24]]

Please note in the output of the np.ix_, the N-arrays returned for the N 1-D input indices you feed to np.ix_ are returned in a way that first one is for rows, second one is for columns, third one is for depth and so on. That is why in the above example, array([[1],[3]]) is for rows and array([[0, 3]]) is for columns. Same goes for the example OP provided in the question. The reason behind it is the way numpy uses advanced indexing for multi-dimensional arrays.

Upvotes: 27

Edo98
Edo98

Reputation: 453

It's basically used to create N array mask or arrays of indexes each one referring to a different dimension. For example if I've a 3d np.ndarray and I want to get only some entries of it I can use numpy.ix to create 3 arrays that will have shapes like (N,1,1) (1,N,1) and (1,1,N) containing the corresponding index for each one of the 3 axis.

Take a look at the examples at numpy documentation page. They're self explanatory.
This function isn't commonly used. I think it's used in some algebra operations like cross product and it's generalisations.

Upvotes: 2

Related Questions