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.
Сохраните в worst_month номер месяца (январь — 1) с самой низкой выручкой для каждого магазина, а в
worst_value — саму эту выручку.
argmin(axis=1); номер месяца на единицу больше.min(axis=1).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
worst_month = ...
worst_value = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
worst_month = monthly.argmin(axis=1) + 1
worst_value = monthly.min(axis=1)Накопленная сумма: 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]]
Сохраните в ytd таблицу накопленной выручки для всех трёх магазинов (та же форма 3 × 12), а в year —
выручку каждого магазина за год, взяв её из последнего столбца ytd.
monthly.cumsum(axis=1).ytd[:, -1].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
ytd = ...
year = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
ytd = monthly.cumsum(axis=1)
year = ytd[:, -1]Что получится: np.array([3, 1, 4, 1]).cumsum()?
sum.Когда впервые: argmax у маски
У маски argmax возвращает индекс первого True: максимум маски — это True (единица), а при равных
максимумах argmax берёт первый. Вместе с cumsum это отвечает на вопрос «в каком месяце магазин впервые
набрал 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) в precip. Сохраните в rain_cum накопленную сумму осадков, а в half_day
— номер дня (с 1), когда накопилась половина годовой суммы.
rain_cum.rain_cum >= rain_cum[-1] / 2; первый True — её argmax, номер дня — плюс один.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
precip = ...
rain_cum = ...
half_day = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
precip = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1, usecols=3)
rain_cum = precip.cumsum()
half_day = (rain_cum >= rain_cum[-1] / 2).argmax() + 1Итоги
argmax(axis=1)/argmin(axis=1)— индекс максимума / минимума в каждой строке;axis=0— в каждом столбце.cumsum()— накопленная сумма; сaxis— вдоль каждой строки или столбца.маска.argmax()— индекс первогоTrue; еслиTrueнет, вернёт 0 — проверяйтеany().