В прошлом уроке маска отвечала «сколько». Теперь используем её, чтобы достать сами значения. Данные те же:
import numpy as np
weather = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1)
tmin = weather[:, 1]
tmax = weather[:, 2]
precip = weather[:, 3]Маска в квадратных скобках
Если подставить маску вместо индекса, a[маска], останутся только элементы, где в маске True:
hot = tmax > 25
print(tmax[hot])
print(len(tmax[hot]), hot.sum())[26. 25.3 26.3 27.2 26.3 25.6 26. 26. 25.4] 9 9
Результат — новый одномерный массив, длина которого равна числу True в маске. Маску не обязательно хранить
в отдельной переменной: условие пишут прямо в скобках — tmax[tmax > 25] читается как «температуры, которые
выше 25».
Сохраните в warm_nights минимальные температуры тех ночей, когда было выше 15 °C, а в warmest_night —
самую тёплую из них.
tmin[tmin > 15].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
warm_nights = ...
warmest_night = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
warm_nights = tmin[tmin > 15]
warmest_night = warm_nights.max()Средние осадки за день — около 2 мм, но в половине дней осадков нет вовсе. Сохраните в rain_only осадки
только тех дней, когда они были (больше 0), а в rain_mean — их среднее.
precip > 0, потом посчитайте среднее того, что осталось.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
rain_only = ...
rain_mean = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
rain_only = precip[precip > 0]
rain_mean = rain_only.mean()Маска годится и для другого массива той же длины: условие по осадкам — а берём температуры. Порядок дней в столбцах одинаковый, поэтому маска по одному столбцу выбирает те же дни в другом:
print(tmax[precip > 0].mean()) # средний максимум в дни с осадками
print(tmax[precip > 10]) # максимумы в дни с сильными осадками9.305357142857144 [-2.8 -4.5 16.3 15.3 20.6 25.4 22. 16.8 13.3 8. 2. ]
Несколько условий: &, |, ~
Условия соединяют знаками:
&— «и»: оба условия верны;|— «или»: верно хотя бы одно;~— «не»: переворачивает маску.
Каждое условие обязательно в скобках: (tmin < 0) & (tmax > 0).
thaw = (tmin < 0) & (tmax > 0)
print(thaw.sum())
print(((precip > 10) | (tmax > 25)).sum())
print((~thaw).sum())38 19 327
Сохраните в thaw_rain число дней, когда максимум был выше 0 °C, минимум — ниже 0 °C, и при этом шли
осадки (больше 0 мм).
&.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
thaw_rain = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
thaw_rain = ((tmax > 0) & (tmin < 0) & (precip > 0)).sum()Необычный день — очень жаркий (максимум выше 25 °C) или очень холодный (минимум ниже −12 °C). Сохраните
в unusual число необычных дней.
|; каждое условие в скобках.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
unusual = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
unusual = ((tmax > 25) | (tmin < -12)).sum()Что получится: a[(a > 5) & (a < 16)], если a = np.array([4, 8, 15, 16])?
& требует обоих условий: больше 5 и меньше 16. Подходят 8 и 15; 16 не меньше 16. Маска в квадратных скобках возвращает сами элементы, а не True/False.Почему не and и почему скобки
(tmin < 0) and (tmax > 0)ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Сохраните в dry_max среднюю максимальную температуру в дни без осадков. Используйте маску дождливых дней
precip > 0 и знак «не».
~(precip > 0) — маска дней, когда осадков не было.tmax и посчитайте среднее.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
dry_max = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
dry_max = tmax[~(precip > 0)].mean()Итоги
a[маска]— только элементы, где в маскеTrue; условие можно писать прямо в скобках:a[a > 25].- Маска по одному массиву выбирает те же позиции в другом массиве той же длины.
&— и,|— или,~— не; каждое условие — в скобках.and,or,notс массивами не работают.- Выборка по маске — это всегда копия, а не представление, как у среза.