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?
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])
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.
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)
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 ;)
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])
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)
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])