Numpy: какова логика функций argmin() и argmax()?
Я не могу понять вывод argmax
и argmin
при использовании с параметром оси. Например:
>>> a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
>>> a
array([[ 1, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 4]])
>>> a.shape
(3, 4)
>>> a.size
12
>>> np.argmax(a)
5
>>> np.argmax(a,axis=0)
array([1, 1, 1, 1])
>>> np.argmax(a,axis=1)
array([3, 1, 1])
>>> np.argmin(a)
0
>>> np.argmin(a,axis=0)
array([0, 0, 2, 2])
>>> np.argmin(a,axis=1)
array([0, 2, 2])
Как вы можете видеть, максимальное значение - это точка (1,1), а минимальная - точка (0,0). Поэтому в моей логике, когда я запускаю:
-
np.argmin(a,axis=0)
Я ожидал array([0,0,0,0])
-
np.argmin(a,axis=1)
Я ожидал array([0,0,0])
-
np.argmax(a,axis=0)
Я ожидал array([1,1,1,1])
-
np.argmax(a,axis=1)
Я ожидал array([1,1,1])
Что не так с моим пониманием вещей?
Ответы
Ответ 1
Добавляя аргумент axis
, NumPy просматривает строки и столбцы отдельно. Когда он не задан, массив a
сглаживается в один 1D-массив.
axis=0
означает, что операция выполняется по столбцам двумерного массива a
по очереди.
Например, np.argmin(a, axis=0)
возвращает индекс минимального значения в каждом из четырех столбцов: минимальное значение первого столбца находится в индексе 0, минимальное значение третьего столбца - в индексе 2 и т.д.
axis=1
означает, что операция выполняется по строкам a
.
Итак np.argmin(a, axis=1)
возвращает [0, 2, 2]
, потому что a
имеет три строки. Индекс минимального значения в первой строке равен 0, индекс минимального значения второй строки равен 2 и т.д.
Ответ 2
Функция np.argmax
по умолчанию работает вдоль сплющенного массива, если вы не указали ось. Чтобы увидеть, что происходит, вы можете явно использовать flatten
:
np.argmax(a)
>>> 5
a.flatten()
>>>> array([ 1, 2, 4, 7, 9, 88, 6, 45, 9, 76, 3, 4])
0 1 2 3 4 5
Я пронумеровал индексы в массиве выше, чтобы сделать его более понятным. Обратите внимание, что индексы нумеруются с нуля в numpy
.
В тех случаях, когда вы указываете ось, она также работает как ожидалось:
np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])
Это говорит о том, что наибольшее значение находится в строке 1
(второе значение) для каждого столбца вдоль axis=0
(вниз). Вы можете увидеть это более четко, если вы немного измените свои данные:
a=np.array([[100,2,4,7],[9,88,6,45],[9,76,3,100]])
a
>>> array([[100, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 100]])
np.argmax(a, axis=0)
>>> array([0, 1, 1, 2])
Как вы теперь видите, оно идентифицирует максимальное значение в строке 0 для столбца 1, строки 1 для столбцов 2 и 3 и строки 3 для столбца 4.
Существует полезное руководство по индексированию numpy
в документации.
Ответ 3
В качестве побочного примечания: если вы хотите найти координаты своего максимального значения в полном массиве, вы можете использовать
a=np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
>>> a
[[ 1 2 4 7]
[ 9 88 6 45]
[ 9 76 3 4]]
c=(np.argmax(a)/len(a[0]),np.argmax(a)%len(a[0]))
>>> c
(1, 1)
Ответ 4
Ось в аргументе функции argmax относится к оси, вдоль которой будет нарезана матрица.
В другом слове np.argmin(a,axis=0)
фактически совпадает с np.apply_along_axis(np.argmin, 0, a)
, то есть для определения минимального местоположения для этих нарезанных векторов вдоль оси = 0.
Поэтому в вашем примере np.argmin(a, axis=0)
есть [0, 0, 2, 2]
, который соответствует значениям [1, 2, 3, 4]
в соответствующих столбцах
Ответ 5
""" ....READ THE COMMENTS FOR CLARIFICATION....."""
import numpy as np
a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
"""np.argmax(a) will give index of max value in flatted array of given matrix """
>>np.arg(max)
5
"""np.argmax(a,axis=0) will return list of indexes of max value coloumnwise"""
>>print(np.argmax(a,axis=0))
[1,1,1,1]
"""np.argmax(a,axis=1) will return list of indexes of max value rowwise"""
>>print(np.argmax(a,axis=1))
[3,1,1]
"""np.argmin(a) will give index of min value in flatted array of given matrix """
>>np.arg(min)
0
"""np.argmin(a,axis=0) will return list of indexes of min value coloumnwise"""
>>print(np.argmin(a,axis=0))
[0,0,2,2]
"""np.argmin(a,axis=0) will return list of indexes of min value rowwise"""
>>print(np.argmin(a,axis=1))
[0,2,2]