I have a 2 dimensional NumPy array. I know how to get the maximum values over axes:
>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])
How can I get the indices of the maximum elements? I would like as output array([1,1,0])
instead.
>>> a.argmax(axis=0)
array([1, 1, 0])
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4
a = np.array([[1,4,3],[4,3,1]])
to see that it returns i,j==0,1
, and neglects the solution at i,j==1,0
. For the indices of all the maxima use instead i,j = where(a==a.max()
.
argmax()
will only return the first occurrence for each row. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html
If you ever need to do this for a shaped array, this works better than unravel
:
import numpy as np
a = np.array([[1,2,3], [4,3,1]]) # Can be of any shape
indices = np.where(a == a.max())
You can also change your conditions:
indices = np.where(a >= 1.5)
The above gives you results in the form that you asked for. Alternatively, you can convert to a list of x,y coordinates by:
x_y_coords = zip(indices[0], indices[1])
indices = np.where(a==a.max())
in line 3?
.max()
instead of .argmax()
. Please edit the answer
x_y_coord = [(0, 2), (1, 1)]
that does NOT match @eumiro answer, and is wrong. For example, try with a = array([[7,8,9],[10,11,12]])
to see that your code does not have any hit on this input. You also mention that this works better than unravel
, but the solution posted by @blas answer the problem of the absolute maximum, not jsut along one axis.
There is argmin()
and argmax()
provided by numpy
that returns the index of the min and max of a numpy array respectively.
Say e.g for 1-D array you'll do something like this
import numpy as np a = np.array([50,1,0,2]) print(a.argmax()) # returns 0 print(a.argmin()) # returns 2
And similarly for multi-dimensional array
import numpy as np a = np.array([[0,2,3],[4,30,1]]) print(a.argmax()) # returns 4 print(a.argmin()) # returns 0
Note that these will only return the index of the first occurrence.
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
Success story sharing