Nous initialisons un tableau numpy avec des zéros comme ci-dessous:
np.zeros((N,N+1))
Mais comment vérifier si tous les éléments d'une matrice de tableau n * n numpy donnée sont égaux à zéro.
La méthode a juste besoin de renvoyer un True si toutes les valeurs sont effectivement nulles.
not np.count_nonzero(np.eye(4))
revenirTrue
que si toutes les valeurs sont égales à 0.Les autres réponses publiées ici fonctionneront, mais la fonction la plus claire et la plus efficace à utiliser est
numpy.any()
:ou
numpy.all(a==0)
car il utilise moins de RAM. (Il ne nécessite pas le tableau temporaire créé par lea==0
terme.)En outre, il est plus rapide quenumpy.count_nonzero(a)
parce qu'il peut revenir immédiatement lorsque le premier élément différent de zéro a été trouvé.np.any()
n'utilise plus la logique de "court-circuit", donc vous ne verrez pas d'avantage de vitesse pour les petits tableaux.la source
any
etall
ne pas court-circuit. Je crois qu'ils sont du sucre pourlogical_or.reduce
etlogical_and.reduce
. Comparez les uns aux autres et mon court-circuitis_in
:all_false = np.zeros(10**8)
all_true = np.ones(10**8)
%timeit np.any(all_false) 91.5 ms ± 1.82 ms per loop
%timeit np.any(all_true) 93.7 ms ± 6.16 ms per loop
%timeit is_in(1, all_true) 293 ns ± 1.65 ns per loop
J'utiliserais np.all ici, si vous avez un tableau a:
la source
np.all(a==a[0])
. Merci beaucoup!Comme le dit une autre réponse, vous pouvez tirer parti des évaluations véridiques / fausses si vous savez que
0
c'est le seul élément faux éventuellement dans votre tableau. Tous les éléments d'un tableau sont faux ssi il n'y a aucun élément de vérité. *Cependant, la réponse affirmait que
any
c'était plus rapide que les autres options en raison en partie du court-circuit. À partir de 2018, Numpyall
etany
ne court-circuitent pas .Si vous faites souvent ce genre de chose, il est très facile de créer vos propres versions de court-circuit en utilisant
numba
:Celles-ci ont tendance à être plus rapides que les versions de Numpy même lorsqu'elles ne sont pas en court-circuit.
count_nonzero
est le plus lent.Quelques entrées pour vérifier les performances:
Vérifier:
* Utile
all
etany
équivalences:la source
Si vous testez tous les zéros pour éviter un avertissement sur une autre fonction numpy, encapsulez la ligne dans un essai, sauf que le bloc vous évitera d'avoir à faire le test des zéros avant l'opération qui vous intéresse ie
la source