1

I have a numpy array of shape (6,5) and i am trying to index it with Boolean arrays. I slice the boolean array along the columns and then use that slice to index the original array, everything is fine, however as soon as i do the same thing along the rows i get the below error. Below is my code,

array([[73, 20, 49, 56, 64],
       [18, 66, 64, 45, 67],
       [27, 83, 71, 85, 61],
       [78, 74, 38, 42, 17],
       [26, 18, 71, 27, 29],
       [41, 16, 17, 24, 75]])

bool = a > 50
bool
array([[ True, False, False,  True,  True],
       [False,  True,  True, False,  True],
       [False,  True,  True,  True,  True],
       [ True,  True, False, False, False],
       [False, False,  True, False, False],
       [False, False, False, False,  True]], dtype=bool)

cols = bool[:,3] # returns values from 3rd column for every row
cols
array([ True, False,  True, False, False, False], dtype=bool)

a[cols]
array([[73, 20, 49, 56, 64],
       [27, 83, 71, 85, 61]])

rows = bool[3,] # returns 3rd row for every column
rows
array([ True,  True, False, False, False], dtype=bool)

a[rows]
IndexError                                Traceback (most recent call last)
<ipython-input-24-5a0658ebcfdb> in <module>()
----> 1 a[rows]

IndexError: boolean index did not match indexed array along dimension 0; dimension is 6 but corresponding boolean dimension is 5
1
  • The number of items in rows is as number as columns. So you have to pass it to the column like a[:,rows]. Commented Jan 27, 2018 at 20:36

1 Answer 1

3

Since there are only 5 entries in rows,

In [18]: rows
Out[18]: array([ True,  True, False, False, False], dtype=bool)

it can't index 6 rows in your array since the lengths don't match.

In [20]: arr.shape
Out[20]: (6, 5)

In [21]: rows.shape
Out[21]: (5,)

When you index into an array like arr[rows] it will be interpreted as you're indexing into axis 0 since rows is an 1D array. So, you have to use : for axis 0, and rows for axis 1 like:

# select all rows but only columns where rows is `True`
In [19]: arr[:, rows]
Out[19]: 
array([[73, 20],
       [18, 66],
       [27, 83],
       [78, 74],
       [26, 18],
       [41, 16]])

Also, please refrain from using bool as a variable name since it's a built-in keyword. This might cause unexpected behaviour, at a later point in your code.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.