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
numpy: what is the logic of the argmin() and argmax() functions?
提问by
I can not understand the output of argmax
and argmin
when 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 expectedarray([0,0,0,0])
np.argmin(a,axis=1)
I expectedarray([0,0,0])
np.argmax(a,axis=0)
I expectedarray([1,1,1,1])
np.argmax(a,axis=1)
I expectedarray([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 axis
argument, NumPy looks at the rows and columns individually. When it's not given, the array a
is flattened into a single 1D array.
通过添加axis
参数,NumPy 分别查看行和列。当它没有给出时,数组a
被展平成一个单一的一维数组。
axis=0
means that the operation is performed downthe columns of a 2D array a
in 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=1
means that the operation is performed acrossthe rows of a
.
在另一方面,axis=1
表示该操作被执行跨越的行a
。
That means np.argmin(a, axis=1)
returns [0, 2, 2]
because a
has 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.argmax
function by default works along the flattened array, unless you specify an axis. To see what is happening you can use flatten
explicitly:
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 numpy
indexing 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]