Cómo contar el número de elementos verdaderos en una matriz bool NumPy

Respuestas:

261

Tienes múltiples opciones. Dos opciones son las siguientes.

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)

Aquí hay un ejemplo:

>>> import numpy as np
>>> boolarr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]], dtype=np.bool)
>>> boolarr
array([[False, False,  True],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)

>>> np.sum(boolarr)
5

Por supuesto, esa es una boolrespuesta específica. En general, puede usar numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
David Alber
fuente
2
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:

>>> sum([True,True,True,False,False])
3

Pero esto no funcionará:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Guillaume Gendre
fuente
Debe "aplanar" la matriz de matrices primero. desafortunadamente, no hay un método integrado, consulte stackoverflow.com/questions/2158395/…
tommy chheng
2
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 result
print target
print np.sum(res[:,0])
print np.sum(res[:,1])

que se puede extender a D dimensiones.

Los resultados son:

Predicción:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

Objetivo:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

Recuento de predicciones correctas para D = 1: 1

Recuento de predicciones correctas para D = 2: 2

Salehinejad
fuente