202 votes

Trouver les indices des éléments égaux à zéro dans un tableau NumPy

NumPy dispose de la fonction/méthode efficace nonzero() pour identifier les indices d'éléments non nuls dans un fichier ndarray objet. Quel est le moyen le plus efficace d'obtenir les indices des éléments qui hacer ont une valeur de zéro ?

304voto

mtrw Points 10098

numpy.where() est mon préféré.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.where(x == 0)[0]
array([1, 3, 5])

22 votes

J'essaie de me souvenir de Python. Pourquoi le where() retourner un tuple ? numpy.where(x == 0)[1] est hors limites. A quoi est couplé le tableau d'index alors ?

0 votes

@Zhubarb - La plupart des utilisations des indeces sont des tuples - np.zeros((3,)) pour faire un vecteur de 3 longueurs par exemple. Je pense que c'est pour faciliter l'analyse des paramètres. Sinon, quelque chose comme np.zeros(3,0,dtype='int16') contre np.zeros(3,3,3,dtype='int16') serait ennuyeux à mettre en œuvre.

8 votes

Non. where renvoie un tuple de ndarray chacun d'entre eux correspondant à une dimension de l'entrée. dans ce cas, l'entrée est un tableau, donc la sortie est un 1-tuple . Si x était une matrice, ce serait une 2-tuple et ainsi de suite

58voto

MSeifert Points 6307

Il y a np.argwhere ,

import numpy as np
arr = np.array([[1,2,3], [0, 1, 0], [7, 0, 2]])
np.argwhere(arr == 0)

qui renvoie tous les indices trouvés sous forme de lignes :

array([[1, 0],    # Indices of the first zero
       [1, 2],    # Indices of the second zero
       [2, 1]],   # Indices of the third zero
      dtype=int64)

29voto

nate c Points 3909

Vous pouvez rechercher n'importe quelle condition scalaire avec :

>>> a = np.asarray([0,1,2,3,4])
>>> a == 0 # or whatver
array([ True, False, False, False, False], dtype=bool)

Ce qui donnera le tableau comme un masque booléen de la condition.

1 votes

Vous pouvez l'utiliser pour accéder aux éléments zéro : a[a==0] = epsilon

26voto

Dusch Points 1

Vous pouvez également utiliser nonzero() en l'utilisant sur un masque booléen de la condition, car False est aussi une sorte de zéro.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])

>>> x==0
array([False, True, False, True, False, True, False, False, False, False, False], dtype=bool)

>>> numpy.nonzero(x==0)[0]
array([1, 3, 5])

Il fait exactement la même chose que mtrw mais c'est plus en rapport avec la question ;)

2 votes

Ceci devrait être la réponse acceptée car c'est l'utilisation conseillée de l'outil nonzero pour vérifier les conditions.

7voto

dvdvck Points 81

Si vous travaillez avec un tableau unidimensionnel, il existe un sucre syntaxique :

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])

0 votes

Cela fonctionne bien tant que je n'ai qu'une seule condition. Et si je veux rechercher "x == numpy.array(0,2,7)" ? Le résultat devrait être array([1,2,3,5,9]). Mais comment puis-je obtenir ce résultat ?

0 votes

Vous pourriez le faire avec : numpy.flatnonzero(numpy.logical_or(numpy.logical_or(x==0, x==2), x==7))

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