[Numpy-discussion] What is up with raw boolean indices (like a[False])?

Aaron Meurer asmeurer at gmail.com
Wed Aug 19 20:07:05 EDT 2020

> > 3. If you have multiple advanced indexing you get annoying broadcasting
> >    of all of these. That is *always* confusing for boolean indices.
> >    0-D should not be too special there...

OK, now that I am learning more about advanced indexing, this
statement is confusing to me. It seems that scalar boolean indices do
not broadcast. For example:

>>> np.arange(2)[False, np.array([True, False])]
array([], dtype=int64)
>>> np.arange(2)[tuple(np.broadcast_arrays(False, np.array([True, False])))]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array: array is 1-dimensional, but 2
were indexed

And indeed, the docs even say, as you noted, "the nonzero equivalence
for Boolean arrays does not hold for zero dimensional boolean arrays,"
which I guess also applies to the broadcasting.

>From what I can tell, the logic is that all integer and boolean arrays
(and scalar ints) are broadcast together, *except* for boolean
scalars. Then the first boolean scalar is replaced with and(all
boolean scalars) and the rest are removed from the index. Then that
index adds a length 1 axis if it is True and 0 if it is False.

So they don't broadcast, but rather "fake broadcast". I still contend
that it would be much more useful, if True were a synonym for newaxis
and False worked like newaxis but instead added a length 0 axis.
Alternately, True and False scalars should behave exactly like all
other boolean arrays with no exceptions (i.e., work like np.nonzero(),
broadcast, etc.). This would be less useful, but more consistent.

Aaron Meurer

More information about the NumPy-Discussion mailing list