Argmax de la matriz numpy que devuelve índices no planos


99

Estoy tratando de obtener los índices del elemento máximo en una matriz Numpy. Esto se puede hacer usando numpy.argmax. Mi problema es que me gustaría encontrar el elemento más grande en toda la matriz y obtener los índices de eso.

numpy.argmax se puede aplicar a lo largo de un eje, que no es lo que quiero, o en la matriz aplanada, que es lo que quiero.

Mi problema es que usar numpy.argmaxcon axis=Nonedevuelve el índice plano cuando quiero el índice multidimensional.

Me vendría bien divmodconseguir un índice no plano, pero esto se siente feo. ¿Hay alguna forma mejor de hacer esto?

Respuestas:


169

Puede utilizar numpy.unravel_index()en el resultado de numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True

21
np.where(a==a.max())

devuelve coordenadas del máximo de elementos, pero tiene que analizar la matriz dos veces.

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

Esto, en comparación con argmax, devuelve las coordenadas de todos los elementos iguales al máximo. argmaxdevuelve solo uno de ellos ( np.ones(5).argmax()devuelve 0).


10
Esto iterará la matriz tres veces, no solo dos. Una vez para encontrar el máximo, una segunda vez para construir el resultado ==y una tercera vez para extraer los Truevalores de este resultado. Tenga en cuenta que puede haber más de un elemento igual al máximo.
Sven Marnach

1

Para obtener el índice no plano de todas las apariciones del valor máximo, puede modificar ligeramente la respuesta de eumiro usando en argwherelugar de where:

np.argwhere(a==a.max())

>>> a = np.array([[1,2,4],[4,3,4]])
>>> np.argwhere(a==a.max())
array([[0, 2],
       [1, 0],
       [1, 2]])

No es efectivo ya que obtienes tres pases y una creación de matriz. Imagine que tenemos una imagen de 9000x7000 (A3 a 600 ppp). ¿Insistiría aún en su solución?
Maksym Ganenko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.