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

2024-05-28 11:17:16 发布

您现在位置:Python中文网/ 问答频道 /正文

与axis参数一起使用时,我无法理解argmaxargmin的输出。例如:

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

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


Tags: 参数sizenp逻辑array事物shapeaxis
3条回答

通过添加axis参数,NumPy分别查看行和列。如果没有给定,数组a将被展平为一个一维数组。

axis=0意味着操作依次在2D数组的列上执行。

例如np.argmin(a, axis=0)返回四列中每个列的最小值的索引。每列中的最小值显示在下面的bold中:

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

另请注意:如果要在完整数组中找到最大值的坐标,可以使用

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)

默认情况下,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])

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

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

相关问题 更多 >