Замена значений по маске в NumPy — это способ условно изменить элементы массива с помощью булевой маски, без циклов и if.

Идея:
булева маска указывает, какие элементы нужно заменить.

Базовый пример:

import numpy as np
 
X = np.array([1, -2, 3, -4])
 
X[X < 0] = 0
# [1 0 3 0]

Разбор:
– выражение X < 0 создаёт булеву маску
– присваивание применяется только там, где маска True

Замена по сложному условию:

X[(X > 2) & (X < 10)] = 99

Работает поэлементно и векторизованно.

Для многомерных массивов:

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

Маска имеет ту же форму, что и массив.

Замена значений на основе агрегатов:

row_mean = M.mean(axis=1)      # shape (n,)
M[row_mean > 0]

Или с присваиванием:

M[row_mean < 0] = 0

Что важно помнить на практике:

– индексация по маске всегда работает с копией при чтении,
но присваивание меняет исходный массив
– форма маски должна совпадать с формой массива или быть broadcast-совместимой
– это основной паттерн очистки и предобработки данных

Альтернативы:

np.where(cond, a, b)
np.maximum(X, 0)
np.clip(X, min, max)

Коротко:
замена значений по маске — это векторизованный способ применить условное присваивание к массиву без циклов и потери производительности.