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

Где максимум в каждой строке

argmax и argmin по осям — лучший месяц каждого магазина; накопленные суммы cumsum — итог с начала года; первый True в маске — когда впервые достигнута цель.

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

axis работает не только с суммой и средним. В этом уроке — три приёма, которые постоянно нужны на практике: где максимум в каждой строке, накопленный итог и «когда впервые».

Данные — выручка трёх магазинов по месяцам, в тысячах рублей: строка — магазин, столбец — месяц.

[ ]Магазины × месяцы
import numpy as np

monthly = np.array([
    [40, 42, 45, 50, 48, 52, 55, 58, 50, 47, 60, 75],    # магазин 1
    [30, 28, 33, 35, 40, 38, 36, 35, 39, 58, 45, 55],    # магазин 2
    [70, 72, 68, 75, 80, 85, 90, 125, 82, 79, 95, 120],  # магазин 3
])
print(monthly.shape)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(3, 12)

argmax по оси

argmax(axis=1) возвращает для каждой строки индекс её максимума — то есть номер лучшего месяца каждого магазина:

[ ]Лучший месяц каждого магазина
best = monthly.argmax(axis=1)
print(best)          # индексы
print(best + 1)      # номера месяцев
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[11  9  7]
[12 10  8]

Индексы месяцев считаются с нуля: 11 — это декабрь. Чтобы получить привычный номер месяца, прибавьте 1.

[ ]Упражнение 1Худший месяц решено

Сохраните в worst_month номер месяца (январь — 1) с самой низкой выручкой для каждого магазина, а в worst_value — саму эту выручку.

worst_month = ...
worst_value = ...

Накопленная сумма: cumsum

cumsum() (cumulative sum) строит массив, где каждый элемент — сумма всех элементов до него включительно. Это «итог с начала года» на каждый месяц; последний элемент равен сумме всего массива:

[ ]Выручка с начала года
first_store = monthly[0]
print(first_store.cumsum())
print(first_store.sum())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[ 40  82 127 177 225 277 332 390 440 487 547 622]
622

С axis=1 накопление идёт вдоль каждой строки — отдельно для каждого магазина:

[ ]Накопление по каждому магазину
print(monthly.cumsum(axis=1))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[[  40   82  127  177  225  277  332  390  440  487  547  622]
 [  30   58   91  126  166  204  240  275  314  372  417  472]
 [  70  142  210  285  365  450  540  665  747  826  921 1041]]
[ ]Упражнение 2Итог с начала года решено

Сохраните в ytd таблицу накопленной выручки для всех трёх магазинов (та же форма 3 × 12), а в year — выручку каждого магазина за год, взяв её из последнего столбца ytd.

ytd = ...
year = ...

Вопрос

Что получится: np.array([3, 1, 4, 1]).cumsum()?

Когда впервые: argmax у маски

У маски argmax возвращает индекс первого True: максимум маски — это True (единица), а при равных максимумах argmax берёт первый. Вместе с cumsum это отвечает на вопрос «в каком месяце магазин впервые набрал 300 тысяч с начала года»:

[ ]Первый месяц, когда набрали 300
ytd_all = monthly.cumsum(axis=1)
reached = ytd_all >= 300
print(reached[0])
print(reached.argmax(axis=1) + 1)   # номер месяца для каждого магазина
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[False False False False False False  True  True  True  True  True  True]
[7 9 5]
[ ]Упражнение 3Половина годовых осадков решено

Загрузите осадки Москвы (столбец 3) в precip. Сохраните в rain_cum накопленную сумму осадков, а в half_day — номер дня (с 1), когда накопилась половина годовой суммы.

precip = ...
rain_cum = ...
half_day = ...

Итоги

  • argmax(axis=1) / argmin(axis=1) — индекс максимума / минимума в каждой строке; axis=0 — в каждом столбце.
  • cumsum() — накопленная сумма; с axis — вдоль каждой строки или столбца.
  • маска.argmax() — индекс первого True; если True нет, вернёт 0 — проверяйте any().

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

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