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

Агрегации по массиву и по оси: 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-го столбца?». Это не то же самое, что максимальное значение — это адрес.

Ключ к правильному чтению результата: всегда держите в голове, какую ось вы схлопнули. Число в результате — это индекс вдоль именно той оси, которую убрали.