How can I get get the position (indices) of the largest value in a multi-dimensional NumPy array?
Asked
Active
Viewed 8.4k times
4 Answers
197
The argmax()
method should help.
Update
(After reading comment) I believe the argmax()
method would work for multi dimensional arrays as well. The linked documentation gives an example of this:
>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3
Update 2
(Thanks to KennyTM's comment) You can use unravel_index(a.argmax(), a.shape)
to get the index as a tuple:
>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

Community
- 1
- 1

Manoj Govindan
- 72,339
- 21
- 134
- 141
-
2
-
93
-
-
4there should really be a built-in function for getting the value as a tuple – endolith Jul 18 '13 at 18:17
-
unravel_index docs: http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.unravel_index.html – Bogdan Varlamov Aug 29 '16 at 00:55
7
(edit) I was referring to an old answer which had been deleted. And the accepted answer came after mine. I agree that argmax
is better than my answer.
Wouldn't it be more readable/intuitive to do like this?
numpy.nonzero(a.max() == a)
(array([1]), array([0]))
Or,
numpy.argwhere(a.max() == a)

otterb
- 2,660
- 2
- 29
- 48
-
4Needlessly slow, because you compute the max and then compare it to all of a. unravel_index(a.argmax(), a.shape). – Peter Oct 24 '14 at 00:25
-
1I voted for this because it assumes nothing about the number of occurrences of a.max() in a. Whereas a.argmax() will return the "first" occurrence (which is ill-defined in the case of a multi-dimensional array since it depends on the choice of traversal path). https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html#numpy.argmax I also think np.where() is a more natural/readable chose rather than np.nonzero(). – FizxMike Apr 24 '17 at 18:30
2
You can simply write a function (that works only in 2d):
def argmax_2d(matrix):
maxN = np.argmax(matrix)
(xD,yD) = matrix.shape
if maxN >= xD:
x = maxN//xD
y = maxN % xD
else:
y = maxN
x = 0
return (x,y)

iFederx
- 845
- 1
- 11
- 16
0
An alternative way is change numpy
array to list
and use max
and index
methods:
List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4