web-dev-qa-db-fra.com

numpy get index où la valeur est true

>>> ex=np.arange(30)
>>> e=np.reshape(ex,[3,10])
>>> e
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])
>>> e>15
array([[False, False, False, False, False, False, False, False, False,
        False],
       [False, False, False, False, False, False,  True,  True,  True,
         True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True]], dtype=bool)

J'ai besoin de trouver les lignes qui ont la valeur true ou les lignes dans e dont la valeur est supérieure à 15. Je pourrais effectuer une itération à l'aide d'une boucle for, cependant, j'aimerais savoir s'il est possible que numpy puisse le faire plus efficacement?

53
change

Pour obtenir les numéros de ligne où au moins un élément est supérieur à 15:

>>> np.where(np.any(e>15, axis=1))
(array([1, 2], dtype=int64),)
53
Jaime

Vous pouvez utiliser la fonction non nulle . il retourne les indices non nuls de l'entrée donnée.

Facile

>>> (e > 15).nonzero()

(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

pour voir les index plus propres, utilisez la méthode transpose:

>>> numpy.transpose((e>15).nonzero())

[[1 6]
 [1 7]
 [1 8]
 [1 9]
 [2 0]
 ...

Pas mal moyen

>>> numpy.nonzero(e > 15)

(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

ou la manière propre:

>>> numpy.transpose(numpy.nonzero(e > 15))

[[1 6]
 [1 7]
 [1 8]
 [1 9]
 [2 0]
 ...
26
Hadi

Une manière simple et propre: utilisez np.argwhere Pour regrouper les index par élément, plutôt que la dimension comme dans np.nonzero(a) (ie, np.argwhere renvoie une ligne pour chaque élément différent de zéro).

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.argwhere(a>4)
array([[5],
       [6],
       [7],
       [8],
       [9]])

np.argwhere(a) est identique à np.transpose(np.nonzero(a)).

Remarque: Vous ne pouvez pas utiliser a(np.argwhere(a>4)) pour obtenir les valeurs correspondantes dans a. La méthode recommandée consiste à utiliser a[(a>4).astype(bool)] ou a[(a>4) != 0] plutôt que a[np.nonzero(a>4)] car ils gèrent correctement les tableaux 0-d. Voir le documentation pour plus de détails. Comme on peut le voir dans l'exemple suivant, a[(a>4).astype(bool)] et a[(a>4) != 0] peuvent être simplifiés en a[a>4].

Autre exemple:

>>> a = np.array([5,-15,-8,-5,10])
>>> a
array([  5, -15,  -8,  -5,  10])
>>> a > 4
array([ True, False, False, False,  True])
>>> a[a > 4]
array([ 5, 10])
>>> a = np.add.outer(a,a)
>>> a
array([[ 10, -10,  -3,   0,  15],
       [-10, -30, -23, -20,  -5],
       [ -3, -23, -16, -13,   2],
       [  0, -20, -13, -10,   5],
       [ 15,  -5,   2,   5,  20]])
>>> a = np.argwhere(a>4)
>>> a
array([[0, 0],
       [0, 4],
       [3, 4],
       [4, 0],
       [4, 3],
       [4, 4]])
>>> [print(i,j) for i,j in a]
0 0
0 4
3 4
4 0
4 3
4 4
0
Opt