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?

Andreas Mueller
fuente

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
Sven Marnach
fuente
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).

eumiro
fuente
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]])
Richard Ludlow
fuente
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