Замена значений по маске в 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)Коротко:
замена значений по маске — это векторизованный способ применить условное присваивание к массиву без циклов и потери производительности.