Векторные условия — это условия, которые применяются сразу ко всем элементам массива, а не к одному значению, как в обычном if. В NumPy они лежат в основе векторизации и почти всегда приводят к булевым маскам.

Идея:
условие записывается один раз, а проверяется автоматически для каждого элемента массива.

Простейший пример:

import numpy as np
 
a = np.array([1, 5, 10, 15])
 
a > 5
# [False False  True  True]

Результат — булев массив той же формы, а не одно значение True/False.

Сравнения выполняются поэлементно:

a == 10
a != 0
a >= 3
a < 100

Комбинирование условий:

(a > 3) & (a < 12)
# [False  True  True False]

Важно:
– использовать &, |, ~
каждое условие в скобках
and / or / not с массивами не работают

Векторные условия + индексация:

a[(a > 3) & (a < 12)]
# [5 10]

Это замена конструкции вида:

for x in a:
    if 3 < x < 12:
        ...

Применение к 2D массивам:

M = np.array([[1, -2, 3],
              [4, -5, 6]])
 
M[M < 0]
# [-2 -5]

Условное изменение значений:

a = np.array([1, -2, 3, -4])
a[a < 0] = 0
# [1 0 3 0]

Альтернатива через np.where:

np.where(a > 0, a, 0)

Это тоже векторное условие, но в функциональной форме.

Практический смысл:

– фильтрация данных
– очистка выбросов
– условные преобразования
– логика без for и if

Коротко:
векторные условия — это поэлементные логические выражения над массивами, которые возвращают булевы маски и позволяют писать условную логику в векторизованном виде.