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