2015-02-24 3 views
15

Я не могу понять вывод argmax и argmin при использовании с параметром оси. Например:numpy: какова логика функций argmin() и argmax()?

>>> 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])

Что случилось с моим понимание вещей?

ответ

22

Добавив аргумент axis, NumPy просматривает строки и столбцы отдельно. Когда он не задан, массив a сплющен в один одномерный массив.

axis=0 означает, что операция выполняется вниз столбцы из 2D массива a в свою очередь.

Например, np.argmin(a, axis=0) возвращает индекс минимального значения в каждом из четырех столбцов: минимальное значение первого столбца находится в индексе 0, минимальное значение третьего столбца - в индексе 2 и т. Д.

axis=1 означает, что операция выполнена через строки a.

So np.argmin(a, axis=1) возвращает [0, 2, 2], потому что a имеет три ряда. Индекс минимального значения в первой строке равен 0, индекс минимального значения второй строки равен 2 и так далее.

+0

Что относительно оси = -1? –

+0

получил это, это должно быть последнее измерение, здесь для 2d это столбец, я думаю –

3

Функция np.argmax по умолчанию работает along the flattened array, если вы не указали ось. Для того, чтобы увидеть, что происходит вы можете использовать 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 в documentation.

0

Ось в аргументе функции 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] на соответствующих столбцах

+0

Спасибо, сэр. Я продвигаюсь, но я принимаю другой ответ, который слишком ясен для моего способа понять вещи. –

4

В качестве примечания: если вы хотите, чтобы найти координаты максимального значения в полном массиве, вы можете использовать

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) 
+3

Или просто: 'np.unravel_index (np.argmax (a), a.shape)' –

0
""" ....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]