Argmax da matriz numpy retornando índices não planos

100

Estou tentando obter os índices do elemento máximo em uma matriz Numpy. Isso pode ser feito usando numpy.argmax. Meu problema é que eu gostaria de encontrar o maior elemento em todo o array e obter os índices disso.

numpy.argmax pode ser aplicado ao longo de um eixo, que não é o que eu quero, ou na matriz achatada, que é mais ou menos o que eu quero.

Meu problema é que usar numpy.argmaxcom axis=Noneretorna o índice plano quando quero o índice multidimensional.

Eu poderia usar divmodpara obter um índice não uniforme, mas isso parece feio. Existe alguma maneira melhor de fazer isso?

Andreas Mueller
fonte

Respostas:

174

Você pode usar numpy.unravel_index()no 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
fonte
21
np.where(a==a.max())

retorna as coordenadas do (s) máximo (s) elemento (s), mas tem que analisar a matriz duas vezes.

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

Isto, comparando com argmax, retorna coordenadas de todos os elementos iguais ao máximo. argmaxretorna apenas um deles ( np.ones(5).argmax()retorna 0).

eumiro
fonte
10
Isso irá iterar o array três vezes, não apenas duas vezes. Uma vez para encontrar o máximo, uma segunda vez para construir o resultado ==e uma terceira vez para extrair os Truevalores desse resultado. Observe que pode haver mais de um item igual ao máximo.
Sven Marnach
1

Para obter o índice não plano de todas as ocorrências do valor máximo, você pode modificar a resposta de eumiro ligeiramente usando em argwherevez 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
fonte
Não é eficaz, pois você obtém três passes e uma criação de matriz. Imagine que temos uma imagem de 9000x7000 (A3 @ 600dpi) - você ainda insiste em sua solução?
Maksym Ganenko de