Finding index of maximum value in array with NumPy
Numpy has an argmax
function that returns just that, although you will have to deal with the nan
s manually. nan
s always get sorted to the end of an array, so with that in mind you can do:
a = np.random.rand(10000)a[np.random.randint(10000, size=(10,))] = np.nana = a.reshape(100, 100)def nanargmax(a): idx = np.argmax(a, axis=None) multi_idx = np.unravel_index(idx, a.shape) if np.isnan(a[multi_idx]): nan_count = np.sum(np.isnan(a)) # In numpy < 1.8 use idx = np.argsort(a, axis=None)[-nan_count-1] idx = np.argpartition(a, -nan_count-1, axis=None)[-nan_count-1] multi_idx = np.unravel_index(idx, a.shape) return multi_idx>>> nanargmax(a)(20, 93)
You should use np.where
In [17]: a=np.random.uniform(0, 10, size=10)In [18]: aOut[18]: array([ 1.43249468, 4.93950873, 7.22094395, 1.20248629, 4.66783985, 6.17578054, 4.6542771 , 7.09244492, 7.58580515, 5.72501954])In [20]: np.where(a==a.max())Out[20]: (array([8]),)
This also works for 2 arrays, the returned value, is the index. Here we create a range from 1 to 9:
x = np.arange(9.).reshape(3, 3)
This returns the index, of the the items that equal 5:
In [34]: np.where(x == 5)Out[34]: (array([1]), array([2])) # the first one is the row index, the second is the column
You can use this value directly to slice your array:
In [35]: x[np.where(x == 5)]Out[35]: array([ 5.])
You want to use numpy.nanargmax
The documentation provides some clear examples.
a = np.array([[np.nan, 4], [2, 3]])print np.argmax(a)0print np.nanargmax(a)1np.nanargmax(a, axis=0)array([1, 0])np.nanargmax(a, axis=1)array([1, 1])