Python numpy:argmin() 和 argmax() 函数的逻辑是什么?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28697993/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 03:37:49  来源:igfitidea点击:

numpy: what is the logic of the argmin() and argmax() functions?

pythonarraysnumpyargmax

提问by

I can not understand the output of argmaxand argminwhen use with the axis parameter. For example:

我无法理解轴参数的输出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])

As you can see, the maximum value is the point (1,1) and the minimum one is the point (0,0). So in my logic when I run:

如您所见,最大值是点 (1,1),最小值是点 (0,0)。所以在我运行时的逻辑中:

  • np.argmin(a,axis=0)I expected array([0,0,0,0])
  • np.argmin(a,axis=1)I expected array([0,0,0])
  • np.argmax(a,axis=0)I expected array([1,1,1,1])
  • np.argmax(a,axis=1)I expected array([1,1,1])
  • 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])

What is wrong with my understanding of things?

我对事物的理解有什么问题?

采纳答案by Alex Riley

By adding the axisargument, NumPy looks at the rows and columns individually. When it's not given, the array ais flattened into a single 1D array.

通过添加axis参数,NumPy 分别查看行和列。当它没有给出时,数组a被展平成一个单一的一维数组。

axis=0means that the operation is performed downthe columns of a 2D array ain turn.

axis=0装置,该操作被执行向下一个二维阵列的列a反过来。

For example np.argmin(a, axis=0)returns the index of the minimum value in each of the four columns. The minimum value in each column is shown in boldbelow:

例如,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])

On the other hand, axis=1means that the operation is performed acrossthe rows of a.

在另一方面,axis=1表示该操作被执行跨越的行a

That means np.argmin(a, axis=1)returns [0, 2, 2]because ahas three rows. The index of the minimum value in the first row is 0, the index of the minimum value of the second and third rows is 2:

这意味着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])

回答by mfitzp

The np.argmaxfunction by default works along the flattened array, unless you specify an axis. To see what is happening you can use flattenexplicitly:

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 

I've numbered the indices under the array above to make it clearer. Note that indices are numbered from zero in numpy.

我已经对上面数组下的索引进行了编号,以使其更清晰。请注意,索引从 0 开始编号numpy

In the cases where you specify the axis, it is also working as expected:

在您指定轴的情况下,它也按预期工作:

np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])

This tells you that the largest value is in row 1(2nd value), for each column along axis=0(down). You can see this more clearly if you change your data a bit:

这告诉您最大值在行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])

As you can see it now identifies the maximum value in row 0 for column 1, row 1 for column 2 and 3 and row 3 for column 4.

如您所见,它现在标识第 1 列的第 0 行、第 2 和第 3 列的第 1 行以及第 4 列的第 3 行中的最大值。

There is a useful guide to numpyindexing in the documentation.

文档中有一个有用的numpy索引指南。

回答by xingzhi.sg

The axis in the argmax function argument, refers to the axis along which the array will be sliced.

argmax 函数参数中的轴是指数组将沿其切片的轴。

In another word, np.argmin(a,axis=0)is effectively the same as np.apply_along_axis(np.argmin, 0, a), that is to find out the minimum location for these sliced vectors along the axis=0.

换句话说,np.argmin(a,axis=0)实际上与 相同np.apply_along_axis(np.argmin, 0, a),即找出这些切片向量沿轴 = 0 的最小位置。

Therefore in your example, np.argmin(a, axis=0)is [0, 0, 2, 2]which corresponding to values of [1, 2, 3, 4]on respective columns

因此,在你的例子,np.argmin(a, axis=0)[0, 0, 2, 2]其中对应于的值[1, 2, 3, 4]在相应的列

回答by MartijnVanAttekum

As a side note: if you want to find the coordinates of your maximum value in the full array, you can use

附带说明:如果要在完整数组中找到最大值的坐标,可以使用

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)

回答by Nitin Ashutosh

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