Skip to content Skip to sidebar Skip to footer

Why Does The Order Of Dimensions Change With Boolean Indexing?

When we have M of shape (a, b, c), and an indexing array v that we use to index the last array, why does M[i, :, v] result in an array of shape (d, b) (with d the number of true va

Solution 1:

According the boolean indexing section of the docs http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing

Combining multiple Boolean indexing arrays or a Boolean with an integer indexing array can best be understood with the obj.nonzero() analogy.

ind = np.nonzero(val)[0]
# array([ 0,  1,  2, ...., 39], dtype=int32)
M[0, :, ind].shape   # (40,20)

So now we go to the section about combining advanced and basic indexing http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

This is a case of the form: x[arr1, :, arr2]

in the first case, the dimensions resulting from the advanced indexing operation come first in the result array, and the subspace dimensions after that.

So the 0 and ind part produce a (40,) selection, while the : in the middle produces a (20,). By putting the : part last, the resulting dimension is (40,20). Basically it does this because there is an ambiguity in this indexing style, so it consistently opts to put the slice part at the end.

A way of selecting these values and maintain the shape you want (more or less) is to use np.ix_ to generate a tuple of indices.

M[np.ix_([0],np.arange(20),ind)].shape # (1, 20, 40)

You can use np.squeeze to remove the initial 1 dimension.

This use of ix_ is illustrated at the end of the 'purely index array indexing' section http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing

Post a Comment for "Why Does The Order Of Dimensions Change With Boolean Indexing?"