web-dev-qa-db-fra.com

Argmax du tableau numpy renvoyant des index non plats

J'essaie d'obtenir les indices de l'élément maximum dans un tableau Numpy . Cela peut être fait avec numpy.argmax. Mon problème est que j'aimerais trouver l'élément le plus important de tout le tableau et en obtenir les indices.

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

Mon problème est que l'utilisation de numpy.argmax avec axis=None renvoie l'index simple lorsque je souhaite l'index multidimensionnel.

Je pourrais utiliser divmod pour obtenir un index non plat, mais cela semble moche. Y a-t-il une meilleure façon de faire cela?

65
Andreas Mueller

Vous pouvez 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
115
Sven Marnach
np.where(a==a.max())

renvoie les coordonnées du ou des éléments maximum, 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 comparant à argmax, renvoie les coordonnées de tous les éléments égales au maximum. argmax renvoie un seul d'entre eux (np.ones(5).argmax() renvoie 0).

14
eumiro

Pour obtenir l'index non uniforme de toutes les occurrences de la valeur maximale, vous pouvez modifier légèrement answer d'eumiro 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
Richard Ludlow