Маска умеет не только отбирать значения, но и менять их. Это главный способ чистить данные: убрать ошибки датчика, обрезать выбросы, превратить числа в категории.
Присваивание по маске
a[маска] = значение записывает значение во все элементы, где в маске True. Остальные не меняются:
import numpy as np
readings = np.array([21.5, -999.0, 22.1, 22.4, -999.0, 23.0])
readings[readings == -999] = 0
print(readings)[21.5 0. 22.1 22.4 0. 23. ]
Присваивание по маске меняет массив на месте. Если исходные данные нужно сохранить — сначала сделайте копию, как в уроке о представлениях.
В sold — число проданных за день чашек, но из-за сбоя кассы в некоторые дни записались отрицательные числа.
Сделайте копию fixed и замените в ней все отрицательные значения нулём. sold не меняйте.
sold.copy().fixed[fixed < 0] = 0.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
sold = np.array([48, 52, -3, 61, 0, -7, 58])
fixed = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
sold = np.array([48, 52, -3, 61, 0, -7, 58])
fixed = sold.copy()
fixed[fixed < 0] = 0Выбор из двух вариантов: np.where
np.where(условие, если_да, если_нет) строит новый массив: там, где условие верно, берётся значение
из второго аргумента, где нет — из третьего. Аргументами могут быть числа и массивы той же длины:
nums = np.array([5, -3, 8, -1])
print(np.where(nums > 0, nums, 0)) # отрицательные → 0
print(np.where(nums > 0, "да", "нет"))[5 0 8 0] ['да' 'нет' 'да' 'нет']
С np.where удобно превращать числа в категории — например, подписывать дни:
weather = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1)
tmax = weather[:, 2]
signs = np.where(tmax > 0, "плюс", "минус")
signs[55:63] # конец февраля — начало мартаarray(['минус', 'минус', 'минус', 'плюс', 'плюс', 'плюс', 'плюс', 'плюс'],
dtype='<U5')У массива строк тип <U5 — это текст длиной до пяти символов (U — Unicode).
Продавцы получают премию 10 % от суммы, на которую их продажи sales превысили план 100 000 ₽; кто план
не выполнил, получает 0. Сохраните премии в bonus.
sales > 100000.(sales - 100000) * 0.1, если нет — 0.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
sales = np.array([120000, 95000, 150000, 80000, 110000])
bonus = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
sales = np.array([120000, 95000, 150000, 80000, 110000])
bonus = np.where(sales > 100000, (sales - 100000) * 0.1, 0)Что получится: np.where(np.array([1, -2, 3]) > 0, 1, 0)?
np.where с тремя аргументами возвращает массив той же длины: 1 там, где условие верно, 0 — где нет. Отобрать элементы ([1, 3]) — это маска в квадратных скобках.Ограничить границами: np.clip
np.clip(a, нижняя, верхняя) «прижимает» значения к границам: всё, что меньше нижней, становится нижней,
всё, что больше верхней, — верхней. Остальное не меняется:
points = np.array([105, 98, -3, 76, 110, 64])
np.clip(points, 0, 100)array([100, 98, 0, 76, 100, 64])
Из-за ошибки в форме в raw попали баллы меньше 0 и больше 100. Сохраните в scores баллы, прижатые
к границам 0 и 100.
np.clip(raw, 0, 100).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
raw = np.array([88, 104, -5, 67, 100, 0, 121])
scores = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
raw = np.array([88, 104, -5, 67, 100, 0, 121])
scores = np.clip(raw, 0, 100)Подпишите каждый день года: "тепло", если максимальная температура tmax 15 °C и выше, и "холодно" —
если ниже. Сохраните подписи в season, а в warm_days — число «тёплых» дней.
np.where(tmax >= 15, "тепло", "холодно").(season == "тепло").sum().Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
season = ...
warm_days = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
season = np.where(tmax >= 15, "тепло", "холодно")
warm_days = (season == "тепло").sum()Итоги
a[маска] = x— заменить подходящие элементы на месте.np.where(условие, да, нет)— новый массив: значение из «да» или «нет» для каждого элемента.np.clip(a, низ, верх)— прижать значения к границам.np.whereс одним аргументом возвращает номера элементов, а не значения.