Агрегации по массиву и по оси: sum, mean, min, max, argmin, argmax
Содержание курса
argmin и argmax: позиция экстремума глобально и по оси
np.argmin и np.argmax — это не агрегации значений, а агрегации индексов. Они не возвращают минимум или максимум — они возвращают позицию, где этот минимум или максимум находится. Это принципиальное отличие от np.min / np.max, и оно важно: тип результата — целое число (или массив целых чисел), а не значение из исходного массива.
Без axis: позиция в «развёрнутом» массиве
Когда вызываете np.argmin(arr) или np.argmax(arr) без параметра axis, NumPy сначала мысленно разворачивает массив в одномерный (как если бы применили .flatten()), а затем находит позицию экстремума в этом одномерном представлении.
import numpy as np
arr = np.array([[3, 1, 4],
[1, 5, 9],
[2, 6, 5]])
# shape (3, 3) → развёрнутый: [3, 1, 4, 1, 5, 9, 2, 6, 5]
print(np.argmin(arr)) # 1 (элемент arr[0,1] = 1, позиция 1 в flatten)
print(np.argmax(arr)) # 5 (элемент arr[1,2] = 9, позиция 5 в flatten)
Развёрнутый массив — это строки, уложенные одна за другой: [3, 1, 4, 1, 5, 9, 2, 6, 5]. Индекс 1 — это второй элемент (значение 1), индекс 5 — шестой (значение 9). Shape результата — пустой кортеж (), то есть скаляр, точно как при глобальной агрегации значений.
С axis=k: индекс вдоль схлопнутой оси
Схема полностью та же, что для np.sum или np.mean с axis: ось k убирается из shape, и для каждого «среза» вдоль оставшихся осей возвращается один целочисленный индекс.
Для массива shape (3, 3):
axis=0схлопывает строки → shape результата(3,), каждое значение — номер строки, в которой максимум данного столбца.axis=1схлопывает столбцы → shape(3,), каждое значение — номер столбца, в котором минимум данной строки.
print(np.argmax(arr, axis=0)) # [0, 2, 1]
# столбец 0: max = 3 → строка 0
# столбец 1: max = 6 → строка 2
# столбец 2: max = 9 → строка 1
print(np.argmin(arr, axis=1)) # [1, 0, 0]
# строка 0: min = 1 → столбец 1
# строка 1: min = 1 → столбец 0
# строка 2: min = 2 → столбец 0
Обратите внимание на смысл: np.argmax(arr, axis=0)[j] отвечает на вопрос «в каком ряду наибольший элемент j-го столбца?». Это не то же самое, что максимальное значение — это адрес.
Ключ к правильному чтению результата: всегда держите в голове, какую ось вы схлопнули. Число в результате — это индекс вдоль именно той оси, которую убрали.
