31

我无法理解与轴参数一起使用时的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])

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

4

5 回答 5

55

通过添加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])

另一方面,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])
于 2015-02-24T14:22:47.933 回答
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 

我已经对上面数组下的索引进行了编号,以使其更清晰。请注意,索引从 0 开始编号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 行中的最大值。

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

于 2015-02-24T14:24:12.553 回答
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)
于 2016-02-02T16:30:21.590 回答
3
""" ....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]
于 2017-09-24T12:16:58.760 回答
1

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]于各个列上的值

于 2015-02-24T14:26:54.887 回答