web-dev-qa-db-fra.com

Rechercher 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 do ont une valeur de zéro?

102
gotgenes

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])
169
mtrw

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 rendra le tableau comme masque booléen de la condition.

19
nate c

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 index 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)
17
MSeifert

Vous pouvez également utiliser nonzero() en l’utilisant sur un masque booléen de la condition, car False est également 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 lié à la question;)

10
Dusch

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])
4
dvdvck
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
sramij

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
Jeril

Vous pouvez utiliser numpy.nonzero pour trouver zéro.

>>> import numpy as np
>>> x = np.array([1,0,2,0,3,0,0,4,0,5,0,6]).reshape(4, 3)
>>> np.nonzero(x==0)  # this is what you want
(array([0, 1, 1, 2, 2, 3]), array([1, 0, 2, 0, 2, 1]))
>>> np.nonzero(x)
(array([0, 0, 1, 2, 3, 3]), array([0, 2, 1, 1, 0, 2]))
0
chmnsk