127 votes

Argmax du tableau numpy retournant des indices non plats

J'essaie d'obtenir les indices de l'élément maximal dans un tableau Numpy. Cela peut être fait en utilisant numpy.argmax . Mon problème est que je voudrais trouver le plus grand élément de tout le tableau et obtenir les indices de celui-ci.

numpy.argmax peut être appliqué soit le long d'un axe, ce qui n'est pas ce que je veux, soit sur le tableau aplati, ce qui est un peu ce que je veux.

Mon problème est qu'en utilisant numpy.argmax avec axis=None renvoie l'index plat alors que je veux l'index multidimensionnel.

Je pourrais utiliser divmod pour obtenir un indice non plat, mais c'est très laid. Existe-t-il une meilleure façon de procéder ?

222voto

Sven Marnach Points 133943

Vous pourriez utiliser numpy.unravel_index() sur le résultat de numpy.argmax() :

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

25voto

eumiro Points 56644
np.where(a==a.max())

renvoie les coordonnées de l'élément ou des éléments maximums, mais doit analyser le tableau deux fois.

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

Ceci, en comparaison avec argmax retourne les coordonnées de tous les éléments égaux au maximum. argmax ne renvoie qu'un seul d'entre eux ( np.ones(5).argmax() renvoie à 0 ).

10 votes

Cela permet d'itérer le tableau trois fois, et non pas seulement deux fois. Une fois pour trouver le maximum, une seconde fois pour construire le résultat de == et une troisième fois pour extraire le True de ce résultat. Notez qu'il peut y avoir plus d'un élément égal au maximum.

1voto

Richard Ludlow Points 81

Pour obtenir l'indice non-plat de toutes les occurrences de la valeur maximale, vous pouvez modifier la fonction eumiro réponse légèrement en utilisant argwhere au lieu 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]])

0 votes

Il n'est pas efficace puisque vous obtenez trois passes et une création de matrice. Imaginons que nous ayons une image de 9000x7000 (A3@600dpi) - insisteriez-vous toujours sur votre solution ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X