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

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

92
demandé sur Peter Mortensen 2011-01-04 00:40:08

7 réponses

Numpy.où() 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])
147
répondu mtrw 2012-07-13 06:46:34

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)

Qui rendra le tableau comme un masque booléen de la condition.

18
répondu nate c 2011-01-03 21:59:06

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)
16
répondu MSeifert 2018-01-09 23:26:15

Vous pouvez aussi utiliser nonzero() en l'utilisant sur un booléen masque de l'état, parce que 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 il est plus lié à la question ;)

9
répondu Dusch 2018-01-09 23:25:09

Si vous travaillez avec un tableau unidimensionnel, il y a 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])
4
répondu dvdvck 2018-01-09 22:35:56
import numpy as np

x = np.array([1,0,2,3,6])
non_zero_arr = np.extract(x>0,x)

min_index = np.amin(non_zero_arr)
min_value = np.argmin(non_zero_arr)
1
répondu sramij 2015-01-15 15:34:02

Je le ferais de la manière suivante:

>>> x = np.array([[1,0,0], [0,2,0], [1,1,0]])
>>> x
array([[1, 0, 0],
       [0, 2, 0],
       [1, 1, 0]])
>>> np.nonzero(x)
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))

# if you want it in coordinates
>>> x[np.nonzero(x)]
array([1, 2, 1, 1])
>>> np.transpose(np.nonzero(x))
array([[0, 0],
       [1, 1],
       [2, 0],
       [2, 1])
1
répondu Jeril 2018-06-14 03:58:15