Cómo contar el número de elementos verdaderos en una matriz bool NumPy
180
Tengo una matriz NumPy 'boolarr' de tipo booleano. Quiero contar la cantidad de elementos cuyos valores son True. ¿Hay una rutina NumPy o Python dedicada para esta tarea? O, ¿necesito iterar sobre los elementos en mi script?
Gracias David Se ven bien. Sobre el método con suma (..), ¿True siempre es igual a 1 en python (o al menos en numpy)? Si no está garantizado, agregaré un cheque, 'if True == 1:' de antemano. Acerca de count_nonzero (..), desafortunadamente, parece que no está implementado en mi módulo numpy en la versión 1.5.1, pero es posible que tenga la oportunidad de usarlo en el futuro.
norio
44
@norio En cuanto a bool: los valores booleanos se tratan como 1 y 0 en operaciones aritméticas. Consulte " Valores booleanos " en la documentación de la Biblioteca estándar de Python. Tenga en cuenta que NumPy's booly Python boolno son lo mismo, pero son compatibles (consulte aquí para obtener más información).
David Alber
1
@norio En cuanto a numpy.count_nonzerono estar en NumPy v1.5.1: tienes razón. Según este anuncio de lanzamiento , se agregó en NumPy v1.6.0.
David Alber
25
FWIW, numpy.count_nonzeroes al menos mil veces más rápido, en mi intérprete de Python. python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"vs.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown
66
@chbrown tienes razón. ¡Pero deberías compararlo en su np.sum(bools)lugar! Sin embargo, np.count_nonzero(bools)todavía es ~ 12 veces más rápido.
mab
29
Esa pregunta resolvió una pregunta bastante similar para mí y pensé que debería compartir:
En Python sin procesar puede usar sum()para contar Truevalores en list:
Gracias guillaume! También funciona con marcos de datos Pandas.
JJFord3
4
En términos de comparar dos matrices numpy y contar el número de coincidencias (por ejemplo, predicción de clase correcta en aprendizaje automático), encontré útil el siguiente ejemplo para dos dimensiones:
import numpy as np
result = np.random.randint(3,size=(5,2))# 5x2 random integer array
target = np.random.randint(3,size=(5,2))# 5x2 random integer array
res = np.equal(result,target)print resultprint targetprint np.sum(res[:,0])print np.sum(res[:,1])
Respuestas:
Tienes múltiples opciones. Dos opciones son las siguientes.
Aquí hay un ejemplo:
Por supuesto, esa es una
bool
respuesta específica. En general, puede usarnumpy.count_nonzero
.fuente
bool
: los valores booleanos se tratan como 1 y 0 en operaciones aritméticas. Consulte " Valores booleanos " en la documentación de la Biblioteca estándar de Python. Tenga en cuenta que NumPy'sbool
y Pythonbool
no son lo mismo, pero son compatibles (consulte aquí para obtener más información).numpy.count_nonzero
no estar en NumPy v1.5.1: tienes razón. Según este anuncio de lanzamiento , se agregó en NumPy v1.6.0.numpy.count_nonzero
es al menos mil veces más rápido, en mi intérprete de Python.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"
vs.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
np.sum(bools)
lugar! Sin embargo,np.count_nonzero(bools)
todavía es ~ 12 veces más rápido.Esa pregunta resolvió una pregunta bastante similar para mí y pensé que debería compartir:
En Python sin procesar puede usar
sum()
para contarTrue
valores enlist
:Pero esto no funcionará:
fuente
En términos de comparar dos matrices numpy y contar el número de coincidencias (por ejemplo, predicción de clase correcta en aprendizaje automático), encontré útil el siguiente ejemplo para dos dimensiones:
que se puede extender a D dimensiones.
Los resultados son:
Predicción:
Objetivo:
Recuento de predicciones correctas para D = 1:
1
Recuento de predicciones correctas para D = 2:
2
fuente