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] на соответствующих столбцах