numpy: какова логика функций argmin() и argmax ()?
Я не могу понять выход argmax
и argmin
при использовании с параметром axis. Например:
>>> 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])
что не так с моим пониманием вещей?
5 ответов
добавить axis
аргумент, NumPy смотрит на строки и столбцы по отдельности. Когда он не задан, массив a
сплющивается в один массив 1D.
axis=0
означает, что операция выполняется вниз столбцы 2D массива a
в свою очередь.
np.argmin(a, axis=0)
возвращает индекс минимального значения в каждом из четырех столбцов. Минимальное значение в каждом столбце отображается в полужирный ниже:
>>> a
array([[ 1, 2, 4, 7], # 0
[ 9, 88, 6, 45], # 1
[ 9, 76, 3, 4]]) # 2
>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])
С другой стороны, axis=1
означает, что операция выполняется на строки a
.
что означает np.argmin(a, axis=1)
возвращает [0, 2, 2]
, потому что a
- три ряда. Индекс минимального значения в первой строке равен 0, индекс минимального значения во второй и третьей строках равен 2:
>>> a
# 0 1 2 3
array([[ 1, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 4]])
>>> np.argmin(a, axis=1)
array([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
(2-е значение) для каждого столбца вдоль 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
индексации в документация.
в качестве примечания: если вы хотите найти координаты своего максимального значения в полном массиве, вы можете использовать
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)
""" ....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 column-wise"""
>>print(np.argmax(a,axis=0))
[1,1,1,1]
"""np.argmax(a,axis=1) will return list of indexes of max value row-wise"""
>>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 column-wise"""
>>print(np.argmin(a,axis=0))
[0,0,2,2]
"""np.argmin(a,axis=0) will return list of indexes of min value row-wise"""
>>print(np.argmin(a,axis=1))
[0,2,2]
ось в аргументе функции 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]
на соответствующих столбцах