numpy:argmin() 和 argmax() 函数的逻辑是什么?
numpy: what is the logic of the argmin() and argmax() functions?
当与轴参数一起使用时,我无法理解 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])
如你所见,最大值是点(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])
我对事物的理解有什么问题?
通过添加 axis
参数,NumPy 会单独查看行和列。如果未给出,数组 a
将展平为单个一维数组。
axis=0
表示对二维数组a
的列依次向下进行操作。
例如np.argmin(a, axis=0)
returns四列中每一列中最小值的索引。每列中的最小值显示在下面的粗体中:
>>> a
array([[ <b>1</b>, <b>2</b>, 4, 7], # 0
[ 9, 88, 6, 45], # 1
[ 9, 76, <b>3</b>, <b>4</b>]]) # 2
>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])
另一方面,axis=1
表示操作跨越 a
行执行。
意思是np.argmin(a, axis=1)
returns[0, 2, 2]
因为a
有三行。第一行最小值索引为0,第二行和第三行最小值索引为2:
>>> a
# 0 1 2 3
array([[ <b>1</b>, 2, 4, 7],
[ 9, 88, <b>6</b>, 45],
[ 9, 76, <b>3</b>, 4]])
>>> np.argmin(a, axis=1)
array([0, 2, 2])
默认情况下 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
行(第 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 列标识最大值。
documentation 中有一个关于 numpy
索引的有用指南。
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]
的值
附带说明:如果你想在整个数组中找到最大值的坐标,你可以使用
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.argmax(a)
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.argmin(a)
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
和 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])
如你所见,最大值是点(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])
我对事物的理解有什么问题?
通过添加 axis
参数,NumPy 会单独查看行和列。如果未给出,数组 a
将展平为单个一维数组。
axis=0
表示对二维数组a
的列依次向下进行操作。
例如np.argmin(a, axis=0)
returns四列中每一列中最小值的索引。每列中的最小值显示在下面的粗体中:
>>> a
array([[ <b>1</b>, <b>2</b>, 4, 7], # 0
[ 9, 88, 6, 45], # 1
[ 9, 76, <b>3</b>, <b>4</b>]]) # 2
>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])
另一方面,axis=1
表示操作跨越 a
行执行。
意思是np.argmin(a, axis=1)
returns[0, 2, 2]
因为a
有三行。第一行最小值索引为0,第二行和第三行最小值索引为2:
>>> a
# 0 1 2 3
array([[ <b>1</b>, 2, 4, 7],
[ 9, 88, <b>6</b>, 45],
[ 9, 76, <b>3</b>, 4]])
>>> np.argmin(a, axis=1)
array([0, 2, 2])
默认情况下 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
行(第 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 列标识最大值。
documentation 中有一个关于 numpy
索引的有用指南。
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]
的值
附带说明:如果你想在整个数组中找到最大值的坐标,你可以使用
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.argmax(a)
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.argmin(a)
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]