Да, в NumPy есть встроенные функции для работы с булевыми масками, которые позволяют избежать ручных циклов и обеспечивают более высокую производительность. Для получения индексов элементов, которые соответствуют определенной маске, выборочно используются функции `numpy.where` или `numpy.nonzero`.
Вот пример того, как можно использовать `numpy.where` для получения индексов элементов, удовлетворяющих условию:
```python
import numpy as np
# Создаем пример массива
arr = np.array([1, 2, 3, 4, 5])
# Задаем булеву маску
mask = arr > 3
# Используем numpy.where для получения индексов элементов, соответствующих маске
indices = np.where(mask)[0] # Помните, что np.where возвращает кортеж массивов
print(indices) # Выведет: [3 4] потому что элементы с индексами 3 и 4 больше 3
```
Если вам не нужно применять сложную логику и достаточно просто найти индексы ненулевых (истинных) элементов в бинарном массиве, вы можете использовать функцию `numpy.nonzero`:
```python
# Используем numpy.nonzero для получения индексов элементов, соответствующих маске
indices = np.nonzero(mask)[0] # Также возвращает кортеж массивов
print(indices) # Выведет: [3 4]
```
В данном случае `numpy.where` и `numpy.nonzero` могут быть использованы взаимозаменяемо, так как обе функции возвращают индексы ненулевых элементов массива. Тем не менее, `numpy.where` может использоваться и для выбора элементов из одного или двух массивов на основе условия, в то время как `numpy.nonzero` всегда работает только с индексами.