numpy: what is the logic of the argmin() and argmax() functions?
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=0
means that the operation is performed down the columns of a 2D array a
in turn.
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 bold below:
>>> aarray([[ 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 across the rows of 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:
>>> a# 0 1 2 3array([[ 1, 2, 4, 7], [ 9, 88, 6, 45], [ 9, 76, 3, 4]])>>> np.argmin(a, axis=1)array([0, 2, 2])
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(a)>>> 5a.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
.
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:
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.
There is a useful guide to numpy
indexing in the documentation.