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

Сравнения

Сравнение массива с числом даёт логический массив — маску. Её сумма отвечает на вопрос «сколько», среднее — «какая доля», any и all — «есть ли хоть один» и «все ли».

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

Сколько в году было жарких дней? Какая доля дней — с дождём? Бывало ли теплее 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
[ ]Упражнение 1Жаркие дни решено

Сохраните в hot маску дней, когда максимальная температура была выше 25 °C, а в n_hot — число таких дней.

hot = ...
n_hot = ...

[ ]Упражнение 2Морозные ночи решено

Сохраните в frost_share долю дней года, когда минимальная температура опускалась ниже −10 °C.

frost_share = ...

Вопрос

Что получится: np.array([3, 7, 1, 9]) > 5?

Есть ли хоть один и все ли

Метод any() отвечает, есть ли в маске хоть одно True, а all() — все ли значения True:

[ ]any и all
print((tmax > 20).any())    # был ли день теплее 20
print((tmax > 20).all())    # все ли дни теплее 20
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
True
False
[ ]Упражнение 3Рекорды решено

Сохраните в over_30 ответ на вопрос «был ли хоть один день с максимумом выше 30 °C», а в always_above — «была ли минимальная температура каждый день выше −20 °C».

over_30 = ...
always_above = ...

Сравнение в if

if ждёт одно значение — правду или ложь. Маска — это много значений сразу, и Python не знает, как её понимать:

[ ]Маска в ifошибка: ValueError
if tmax > 25:
    print("жарко")
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
[ ]Упражнение 4Дни без осадков решено

Сохраните в rainy число дней, когда шёл дождь или снег (осадки больше нуля), а в dry — число дней совсем без осадков.

rainy = ...
dry = ...

Итоги

  • >, <, >=, <=, ==, != с массивом дают маску — массив из True и False.
  • маска.sum() — сколько подошло, маска.mean() — какая доля.
  • any() — есть ли хоть одно True, all() — все ли True.
  • Маску нельзя подставить в if напрямую — нужно any() или all().

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

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