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?
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?
Respuestas:
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 bool
respuesta específica. En general, puede usar numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
y Python bool
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 contar True
valores en list
:
>>> sum([True,True,True,False,False])
3
Pero esto no funcionará:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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