Как подсчитать количество истинных элементов в массиве NumPy bool

У меня есть массив NumPy 'boolarr' типа boolean. Я хочу подсчитать количество элементов, значения которых True. Есть ли программа NumPy или Python, предназначенная для этой задачи? Или мне нужно перебирать элементы в моем script?

Ответ 1

У вас есть несколько вариантов. Возможны два варианта.

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

Вот пример:

>>> 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

Конечно, это bool -специфический ответ. В более общем плане вы можете использовать numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5

Ответ 2

Этот вопрос решил для меня довольно похожий вопрос, и я подумал, что должен поделиться:

В сыром питоне вы можете использовать sum() для подсчета значений True в list:

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

Но это не сработает:

>>> sum([[False, False, True], [True, False, True]])
TypeError...

Ответ 3

С точки зрения сравнения двух массивов numpy и подсчета количества совпадений (например, правильного предсказания класса в машинном обучении) я нашел приведенный ниже пример для двух измерений:

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])

который может быть расширен до D-мер.

Результаты:

Прогноз:

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

Цель:

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

Количество правильного предсказания для D = 1: 1

Количество правильного предсказания для D = 2: 2

Ответ 4

Если вы хотите подсчитать количество строк, укажите axis=1 для sum:

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

Точно так же с np.count_nonzero:

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])