Inicializamos una matriz numpy con ceros como se muestra a continuación:
np.zeros((N,N+1))
Pero, ¿cómo verificamos si todos los elementos en una matriz de matriz numérica dada n * n son cero?
El método solo necesita devolver un verdadero si todos los valores son realmente cero.
not np.count_nonzero(np.eye(4))
regresarTrue
solo si todos los valores son 0.Las otras respuestas publicadas aquí funcionarán, pero la función más clara y eficiente para usar es
numpy.any()
:o
numpy.all(a==0)
esto porque usa menos RAM. (No requiere la matriz temporal creada por ela==0
término).Además, es más rápidonumpy.count_nonzero(a)
porque puede regresar inmediatamente cuando se ha encontrado el primer elemento distinto de cero.np.any()
ya no usa la lógica de "cortocircuito", por lo que no verá un beneficio de velocidad para arreglos pequeños.fuente
any
yall
hacer no cortocircuito. Creo que son azúcar paralogical_or.reduce
ylogical_and.reduce
. Compárense entre sí y mi cortocircuitois_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
Usaría np.all aquí, si tiene una matriz a:
fuente
np.all(a==a[0])
. ¡Muchas gracias!Como dice otra respuesta, puede aprovechar las evaluaciones de verdad / falsedad si sabe que
0
es el único elemento falso posiblemente en su matriz. Todos los elementos de una matriz son falsos si no hay elementos veraces en ella. *Sin embargo, la respuesta afirmó que
any
era más rápido que otras opciones debido en parte al cortocircuito. A partir de 2018, Numpy'sall
yany
no cortocircuito .Si hace este tipo de cosas con frecuencia, es muy fácil crear sus propias versiones de cortocircuito usando
numba
:Estos tienden a ser más rápidos que las versiones de Numpy incluso cuando no están en cortocircuito.
count_nonzero
es el más lento.Algunas aportaciones para comprobar el rendimiento:
Cheque:
* Útil
all
yany
equivalencias:fuente
Si está probando todos los ceros para evitar una advertencia en otra función numérica, luego envuelva la línea en un intento, excepto que el bloque le ahorrará tener que hacer la prueba de ceros antes de la operación que le interesa, es decir.
fuente