Skip to content

Boolean indexing when elements of mask shape are zero? #929

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
mdhaber opened this issue Apr 18, 2025 · 1 comment
Open

Boolean indexing when elements of mask shape are zero? #929

mdhaber opened this issue Apr 18, 2025 · 1 comment

Comments

@mdhaber
Copy link
Contributor

mdhaber commented Apr 18, 2025

The standard seems to allow elements of a boolean index's shape to be zero.

The size of each dimension in B must equal the size of the corresponding dimension in A or be 0,

But I have read a few times, and I don't think it specifies what should happen in this case.

This returns an empty array in NumPy, CuPy, array_api_strict, and jax.numpy.

import array_api_strict as xp
x = xp.asarray([1, 2, 3])
i = xp.asarray([], dtype=xp.bool)
x[i]  # array([], dtype=int64)

The behavior would follow from the usual rules if the index were integral, but it's not obvious to me that this should work for a boolean index of zero size. Indeed, PyTorch fails with:

IndexError: The shape of the mask [0] at index 0 does not match the shape of the indexed tensor [3] at index 0

and dask.array fails with:

ValueError: operands could not be broadcast together with shapes (3,) (0,)

If the NumPy behavior is desired, does it follow from the usual rule, or is it a special case? Either way, it would help to spell out the desired behavior to ensure consistency among backends.

@seberg
Copy link
Contributor

seberg commented Apr 22, 2025

Not sure where the zero rule comes from, although maybe I am forgetting somthing? I suspect it drops out of the special case to make empty lists work and is strictly incorrect for boolean arrays.

FWIW, I consider it a NumPy bug to allow this, although it may make sense to deprecate rather than just remove it. (Length 0 simply isn't special.)
It has certainly no reason to exist here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants