Нашли ошибку?
Скачать чистый
урок 3 из 4≈ 15 минупражнения: 0 из 4

Условная замена

Заменить значения, которые подходят под условие, — присваиванием по маске, выбором из двух вариантов np.where и ограничением границами np.clip.

Python запустится при первом выполнении

Маска умеет не только отбирать значения, но и менять их. Это главный способ чистить данные: убрать ошибки датчика, обрезать выбросы, превратить числа в категории.

Присваивание по маске

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. ]

Присваивание по маске меняет массив на месте. Если исходные данные нужно сохранить — сначала сделайте копию, как в уроке о представлениях.

[ ]Упражнение 1Отрицательные продажи решено

В sold — число проданных за день чашек, но из-за сбоя кассы в некоторые дни записались отрицательные числа. Сделайте копию fixed и замените в ней все отрицательные значения нулём. sold не меняйте.

sold = np.array([48, 52, -3, 61, 0, -7, 58])
fixed = ...

Выбор из двух вариантов: np.where

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).

[ ]Упражнение 2Премия за перевыполнение решено

Продавцы получают премию 10 % от суммы, на которую их продажи sales превысили план 100 000 ₽; кто план не выполнил, получает 0. Сохраните премии в bonus.

sales = np.array([120000, 95000, 150000, 80000, 110000])
bonus = ...

Вопрос

Что получится: np.where(np.array([1, -2, 3]) > 0, 1, 0)?

Ограничить границами: np.clip

np.clip(a, нижняя, верхняя) «прижимает» значения к границам: всё, что меньше нижней, становится нижней, всё, что больше верхней, — верхней. Остальное не меняется:

[ ]Баллы от 0 до 100
points = np.array([105, 98, -3, 76, 110, 64])
np.clip(points, 0, 100)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
array([100,  98,   0,  76, 100,  64])
[ ]Упражнение 3Правильные баллы решено

Из-за ошибки в форме в raw попали баллы меньше 0 и больше 100. Сохраните в scores баллы, прижатые к границам 0 и 100.

raw = np.array([88, 104, -5, 67, 100, 0, 121])
scores = ...

[ ]Упражнение 4Сезон по температуре решено

Подпишите каждый день года: "тепло", если максимальная температура tmax 15 °C и выше, и "холодно" — если ниже. Сохраните подписи в season, а в warm_days — число «тёплых» дней.

season = ...
warm_days = ...

Итоги

  • a[маска] = x — заменить подходящие элементы на месте.
  • np.where(условие, да, нет) — новый массив: значение из «да» или «нет» для каждого элемента.
  • np.clip(a, низ, верх) — прижать значения к границам.
  • np.where с одним аргументом возвращает номера элементов, а не значения.

Подробнее в справочнике

Нашли ошибку?