NumPy: вычисления и устройство массивов

Агрегации по массиву и по оси: sum, mean, min, max, argmin, argmax

Содержание курса

В прошлом уроке мы научились применять векторные операции к каждому элементу массива — складывать, сравнивать, обрезать значения через np.where и np.clip. Теперь задача другая: не преобразовать каждый элемент по отдельности, а получить из всего массива одно итоговое число — сумму, среднее, минимум или максимум.

Глобальная агрегация: sum, mean, min, max по всему массиву

Агрегация — это сворачивание нескольких значений в одно. Самый простой случай: передать массив целиком в np.sum, np.mean, np.min или np.max без каких-либо дополнительных параметров. NumPy обойдёт все элементы, независимо от формы массива, и вернёт один скаляр.

Посмотрим на конкретном примере:

import numpy as np

arr = np.array([[3, 1, 4],
                [1, 5, 9],
                [2, 6, 5]])

print(np.sum(arr))   # 36
print(np.mean(arr))  # 4.0
print(np.min(arr))   # 1
print(np.max(arr))   # 9

Массив имеет shape (3, 3) — девять элементов. Каждая из четырёх функций вернёт одно число: np.sum сложит все девять, np.mean поделит сумму на количество, np.min и np.max найдут крайние значения.

Важная деталь: результат — не Python-число, а NumPy-скаляр. Его shape — пустой кортеж (), что буквально означает «ноль измерений».

result = np.sum(arr)
print(type(result))    # <class 'numpy.int64'> или аналогичный
print(result.shape)    # ()

Это работает для массивов любой формы: одномерных, двумерных, трёхмерных — не важно. Если axis не указан, NumPy считает, что нужно схлопнуть сразу все оси, и возвращает единственное число. Форма исходного массива влияет только на то, сколько элементов участвует в вычислении, но не на форму результата — она всегда ().

Это полезно, когда нужна одна общая характеристика: суммарная выручка по всей таблице продаж, средняя температура за весь период, глобальный минимум в матрице весов. Когда же нужен результат отдельно по строкам или столбцам — вступает в игру параметр axis, о котором пойдёт речь в следующем разделе.