Продвинутая индексация: булевы маски и целочисленные массивы индексов
Содержание курса
Комбинирование булевых масок через &, | и ~
Одна маска описывает одно условие. Но на практике условия почти всегда составные: «значение больше 10 и меньше 50», «отрицательное или нулевое», «всё, кроме выбросов». Для этого маски комбинируют поэлементными логическими операторами.
Три оператора:
&— истина только если оба условия выполнены одновременно;|— истина если выполнено хотя бы одно из условий;~— инверсия: True становится False и наоборот.
Все три работают поэлементно, как обычные арифметические операторы NumPy, и возвращают булеву маску той же формы.
Главное синтаксическое требование: каждое подусловие должно быть в круглых скобках. Без них Python разбирает выражение не так, как вы ожидаете, и получается ошибка или неверный результат.
import numpy as np
arr = np.array([5, 12, 3, 47, 28, 9])
# Оба условия должны быть истинны одновременно
mask_and = (arr > 5) & (arr < 30)
print(mask_and) # [False True False False True True]
# Хотя бы одно из условий
mask_or = (arr < 5) | (arr > 40)
print(mask_or) # [False False True True False False]
# Инверсия маски
mask_base = arr >= 10
print(~mask_base) # [ True False True False False True]
Обратите внимание: mask_and имеет тот же shape, что и arr — (6,). Комбинирование не меняет форму, только значения внутри.
Операторы and, or, not здесь не работают — они рассчитаны на одиночные булевы значения Python, а не на массивы. NumPy специально перегружает &, |, ~ для поэлементной логики.
Можно строить цепочки из нескольких условий, главное — не забывать скобки вокруг каждого:
# Три условия подряд
mask_chain = (arr > 3) & (arr < 30) & (arr != 9)
print(mask_chain) # [True True False False True False]
На этом этапе мы только строим составную маску и убеждаемся в её форме и содержимом. Как применить её для выбора элементов — следующий шаг.
