NumPy: массивы, форма и индексация

Продвинутая индексация: булевы маски и целочисленные массивы индексов

Содержание курса

Комбинирование булевых масок через &, | и ~

Одна маска описывает одно условие. Но на практике условия почти всегда составные: «значение больше 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]

На этом этапе мы только строим составную маску и убеждаемся в её форме и содержимом. Как применить её для выбора элементов — следующий шаг.