Numpy: obtenir la colonne et de la ligne de l'indice de la valeur minimale d'un tableau 2D
Par exemple,
x = array([[1,2,3],[3,2,5],[9,0,2]])
some_func(x) gives (2,1)
Je sais on peut le faire par une fonction personnalisée:
def find_min_idx(x):
k = x.argmin()
ncol = x.shape[1]
return k/ncol, k%ncol
Cependant, je me demande si il y a un numpy intégré dans la fonction qui fait cela plus rapidement.
Grâce.
EDIT: merci pour les réponses. J'ai testé leurs vitesses comme suit:
%timeit np.unravel_index(x.argmin(), x.shape)
#100000 loops, best of 3: 4.67 µs per loop
%timeit np.where(x==x.min())
#100000 loops, best of 3: 12.7 µs per loop
%timeit find_min_idx(x) # this is using the custom function above
#100000 loops, best of 3: 2.44 µs per loop
Semble que la fonction personnalisée est effectivement plus rapide que unravel_index() et où(). unravel_index() n'choses semblables que la fonction personnalisée, plus la charge de la vérification des arguments supplémentaires. où() est capable de retourner plusieurs indices mais il est beaucoup plus lent pour mon but. Peut-être pur code python n'est pas lent pour faire juste deux arithmétique simple et la fonction personnalisée approche est aussi rapide que l'on peut obtenir.
np.where(x == np.min(x))
?OriginalL'auteur N. H. | 2015-05-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
np.where
:Aussi comme @senderle mentionné dans un commentaire, pour obtenir des valeurs dans un tableau, vous pouvez utiliser
np.argwhere
:Mis à jour à:
Que l'OP s parfois, et de façon beaucoup plus claire que
argmin
est souhaitée (pas dupliqué minutes etc.), une façon, je pense que peut légèrement améliorer OP approche originale consiste à utiliserdivmod
:Chronométré et vous verrez que des bits supplémentaires de vitesse, pas de beaucoup mais quand même une amélioration.
Si vous êtes vraiment préoccupé par la performance, vous pouvez prendre un coup d'oeil à cython.
argwhere
ainsi -- dépend de NH besoins les valeurs pour être utilisable comme indices ou sous forme de valeurs dans un tableau.bon, maintenant, mis à jour
Mais en la regardant de plus que la distinction ne tient que lorsque la valeur minimale se produit plus d'une fois.
L'OP a une solution de travail, je ne suis donc pas surpris que peut être facilement converti comme
tuple(map(int, np.where(x == np.min(x))))
merci pour la mise à jour. Chaque geste compte!
OriginalL'auteur Anzel
Vous pouvez utiliser np.unravel_index
Si c'est la réponse, n'est-ce pas toute la question d'une dup de ceci?
Revoir mon dernier commentaire -- cela fonctionne pour l'indexation ou comme une séquence d'indices, mais seulement parce que
argmin
retourne qu'une seule valeur, même si le minimum se produit plusieurs fois. Lewhere(x == np.min(x))
solution peut capturer plusieurs minima.Tout à fait raison. Je suis juste obsessionnelle de travail grâce à tous les détails, sans doute inutilement!
vous avez peut-être raison mais je ne sais pas si je suis encore.
OriginalL'auteur Padraic Cunningham