简体   繁体   中英

Numpy - Indexing with Boolean array

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM