Як підрахувати кількість справжніх елементів у масиві bool NumPy


181

У мене є масив NumPy 'boolarr' булевого типу. Я хочу порахувати кількість елементів, значення яких є True. Чи є програма NumPy або Python, призначена для цього завдання? Або мені потрібно перебирати елементи мого сценарію?


Відповіді:


262

У вас є кілька варіантів. Два варіанти - наступні.

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
Спасибі, Девіде. Вони виглядають акуратно. Про метод із сумою (..), чи правда завжди дорівнює 1 у python (або принаймні у numpy)? Якщо це не гарантовано, я заздалегідь додаю чек "якщо True == 1:". Про count_nonzero (..), на жаль, він, здається, не реалізований у моєму модулі numpy у версії 1.5.1, але я, можливо, матиму шанс використовувати його в майбутньому.
norio

4
@norio Щодо bool: булеві значення в арифметичних операціях трактуються як 1 і 0. Дивіться " Булеві значення " в документації зі стандартної бібліотеки Python. Зауважте, що NumPy boolта Python boolне однакові, але вони сумісні (див. Тут для отримання додаткової інформації).
Девід Альбер

1
@norio Що стосується того, що ви numpy.count_nonzeroне знаходитесь у NumPy v1.5.1: ви праві. Згідно з цим повідомленням про реліз , він був доданий у NumPy v1.6.0.
Девід Альбер

25
FWIW, numpy.count_nonzeroприблизно в тисячу разів швидше, як мінімум, в моєму перекладачі 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

6
@chbrown ви праві. Але вам слід порівняти np.sum(bools)замість цього! Однак np.count_nonzero(bools)все-таки ~ 12x швидше.
мак

30

Це питання вирішило для мене досить подібне питання, і я подумав, що мені слід поділитися:

У сирому пітоні ви можете використовувати sum()для підрахунку Trueзначень у list:

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

Але це не спрацює:

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

Спершу слід «згладити» масив масивів. на жаль, немає ніякого способу вбудованого см stackoverflow.com/questions/2158395 / ...
автоматники chheng

2
Дякую Гійом! Працює і з фреймами даних Pandas.
JJFord3

5

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.