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

28 python arrays numpy argmax

我无法理解的输出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])
Run Code Online (Sandbox Code Playgroud)

如您所见,最大值是点(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])

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

Ale*_*ley 47

通过添加axis参数,NumPy分别查看行和列.如果没有给出,则将阵列展a平为单个1D阵列.

axis=0意味着该操作被执行向下一个二维阵列的列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])
Run Code Online (Sandbox Code Playgroud)

另一方面,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])
Run Code Online (Sandbox Code Playgroud)

  • 轴=-1 怎么样? (2认同)

mfi*_*tzp 5

除非指定轴,否则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 
Run Code Online (Sandbox Code Playgroud)

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

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

np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

这告诉您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])
Run Code Online (Sandbox Code Playgroud)

如您所见,它现在标识第1行第0行的最大值,第2列第3行第3列和第4列第3行.

numpy文档中有一个有用的索引索引.