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

Фильтр по маске

Маска в квадратных скобках оставляет только подходящие элементы. Несколько условий соединяют знаками &, | и ~ — и обязательно в скобках.

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

В прошлом уроке маска отвечала «сколько». Теперь используем её, чтобы достать сами значения. Данные те же:

[ ]Погода: три столбца
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».

[ ]Упражнение 1Тёплые ночи решено

Сохраните в warm_nights минимальные температуры тех ночей, когда было выше 15 °C, а в warmest_night — самую тёплую из них.

warm_nights = ...
warmest_night = ...

[ ]Упражнение 2Сколько льёт, когда льёт решено

Средние осадки за день — около 2 мм, но в половине дней осадков нет вовсе. Сохраните в rain_only осадки только тех дней, когда они были (больше 0), а в rain_mean — их среднее.

rain_only = ...
rain_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
[ ]Упражнение 3Оттепель с дождём решено

Сохраните в thaw_rain число дней, когда максимум был выше 0 °C, минимум — ниже 0 °C, и при этом шли осадки (больше 0 мм).

thaw_rain = ...

[ ]Упражнение 4Необычные дни решено

Необычный день — очень жаркий (максимум выше 25 °C) или очень холодный (минимум ниже −12 °C). Сохраните в unusual число необычных дней.

unusual = ...

Вопрос

Что получится: a[(a > 5) & (a < 16)], если a = np.array([4, 8, 15, 16])?

Почему не and и почему скобки

[ ]and с массивамиошибка: ValueError
(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()
[ ]Упражнение 5Средний максимум сухих дней решено

Сохраните в dry_max среднюю максимальную температуру в дни без осадков. Используйте маску дождливых дней precip > 0 и знак «не».

dry_max = ...

Итоги

  • a[маска] — только элементы, где в маске True; условие можно писать прямо в скобках: a[a > 25].
  • Маска по одному массиву выбирает те же позиции в другом массиве той же длины.
  • & — и, | — или, ~ — не; каждое условие — в скобках.
  • and, or, not с массивами не работают.
  • Выборка по маске — это всегда копия, а не представление, как у среза.

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

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