Сколько в году было жарких дней? Какая доля дней — с дождём? Бывало ли теплее 30 градусов? Такие вопросы начинаются со сравнения. Загрузим погоду и возьмём столбцы, как в прошлом модуле:
import numpy as np
weather = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1)
tmin = weather[:, 1]
tmax = weather[:, 2]
precip = weather[:, 3]
print(tmax[55:63]) # конец февраля — начало марта[-4.5 -3.4 -0.9 0.5 4.6 4.2 4.3 2.4]
Сравнение — тоже поэлементно
Знаки >, <, >=, <=, == (равно) и != (не равно) работают с массивом так же, как арифметика: к каждому
элементу. Результат — массив из True и False той же длины. Такой массив называют маской (mask):
warm = tmax > 0
print(warm[55:63])
print(warm.shape, warm.dtype)[False False False True True True True True] (365,) bool
Маска говорит про каждый день: подходит он под условие или нет. Сравнивать можно и два массива — пара за парой: например, максимум каждого дня выше его минимума.
print((tmax > tmin)[:5])
print((tmax > tmin).all())[ True True True True True] True
Сколько и какая доля
Мы уже знаем, что True считается как 1, а False — как 0. Поэтому у маски сумма — сколько элементов
подошло, а среднее — какая доля:
print((tmax > 0).sum()) # сколько дней с плюсом
print((tmax > 0).mean()) # какая это доля года259 0.7095890410958904
Сохраните в hot маску дней, когда максимальная температура была выше 25 °C, а в n_hot — число таких дней.
tmax > 25.True в маске — её сумма.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
hot = ...
n_hot = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
hot = tmax > 25
n_hot = hot.sum()Сохраните в frost_share долю дней года, когда минимальная температура опускалась ниже −10 °C.
True в маске — её среднее.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
frost_share = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
frost_share = (tmin < -10).mean()Что получится: np.array([3, 7, 1, 9]) > 5?
True/False на каждый элемент. Сами элементы больше 5 ([7, 9]) можно получить по маске — это следующий урок, а число 2 — сумма маски.Есть ли хоть один и все ли
Метод any() отвечает, есть ли в маске хоть одно True, а all() — все ли значения True:
print((tmax > 20).any()) # был ли день теплее 20
print((tmax > 20).all()) # все ли дни теплее 20True False
Сохраните в over_30 ответ на вопрос «был ли хоть один день с максимумом выше 30 °C», а в always_above —
«была ли минимальная температура каждый день выше −20 °C».
any(), «каждый» — all(); вызывайте их у маски.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
over_30 = ...
always_above = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
over_30 = (tmax > 30).any()
always_above = (tmin > -20).all()Сравнение в if
if ждёт одно значение — правду или ложь. Маска — это много значений сразу, и Python не знает, как её
понимать:
if tmax > 25:
print("жарко")ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Сохраните в rainy число дней, когда шёл дождь или снег (осадки больше нуля), а в dry — число дней совсем без
осадков.
==.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
rainy = ...
dry = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
rainy = (precip > 0).sum()
dry = (precip == 0).sum()Итоги
>,<,>=,<=,==,!=с массивом дают маску — массив изTrueиFalse.маска.sum()— сколько подошло,маска.mean()— какая доля.any()— есть ли хоть одноTrue,all()— все лиTrue.- Маску нельзя подставить в
ifнапрямую — нужноany()илиall().