Jak policzyć liczbę prawdziwych elementów w tablicy bool NumPy

180

Mam tablicę NumPy „boolarr” typu boolowskiego. Chcę policzyć liczbę elementów, których wartości są True. Czy istnieje funkcja NumPy lub Python przeznaczona do tego zadania? Czy też muszę iterować elementy w moim skrypcie?

norio
źródło
4
W przypadku pand: stackoverflow.com/questions/26053849/…
Prywatny

Odpowiedzi:

261

Masz wiele opcji. Dwie opcje są następujące.

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

Oto przykład:

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

Oczywiście jest to boolodpowiedź specyficzna. Mówiąc bardziej ogólnie, możesz użyć numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
David Alber
źródło
2
Dzięki, David. Wyglądają schludnie. Jeśli chodzi o metodę z sumą (..), czy prawda jest zawsze równa 1 w pythonie (lub przynajmniej w numpy)? Jeśli nie jest to zagwarantowane, dodam wcześniej czek „jeśli prawda == 1:”. Jeśli chodzi o count_nonzero (..), niestety wydaje się, że nie jest on zaimplementowany w moim module numpy w wersji 1.5.1, ale mogę mieć szansę go użyć w przyszłości.
norio
4
@norio Odnośnie bool: wartości logiczne są traktowane jako 1 i 0 w operacjach arytmetycznych. Zobacz „ Wartości boolowskie ” w dokumentacji biblioteki standardowej Python. Zauważ, że NumPy użytkownika booli Python boolnie są takie same, ale są one zgodne (patrz tutaj , aby uzyskać więcej informacji).
David Alber,
1
@ norio Co do nieobecności numpy.count_nonzerow NumPy v1.5.1: masz rację. Zgodnie z tym ogłoszeniem o wydaniu dodano go w NumPy v1.6.0.
David Alber,
25
FWIW, numpy.count_nonzerojest około tysiąc razy szybszy, przynajmniej w moim interpretatorze Pythona. 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
@brown masz rację. Ale powinieneś porównać do np.sum(bools)! Jest jednak np.count_nonzero(bools)nadal ~ 12 razy szybszy.
mab
29

To pytanie rozwiązało dla mnie dość podobne pytanie i pomyślałem, że powinienem podzielić się:

W surowym pythonie możesz używać sum()do zliczania Truewartości w list:

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

Ale to nie zadziała:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Guillaume Gendre
źródło
Najpierw powinieneś „spłaszczyć” tablicę tablic. niestety nie ma wbudowanej metody, patrz stackoverflow.com/questions/2158395/...
Tommy Chheng,
2
Dzięki Guillaume! Współpracuje również z ramkami danych Pandas.
JJFord3
4

Jeśli chodzi o porównanie dwóch tablic liczb liczbowych i policzenie liczby dopasowań (np. Prawidłowe przewidywanie klas w uczeniu maszynowym), znalazłem poniższy przykład dla dwóch wymiarów:

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

które można rozszerzyć na wymiary D.

Wyniki są następujące:

Prognoza:

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

Cel:

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

Liczba poprawnych prognoz dla D = 1: 1

Liczba poprawnych prognoz dla D = 2: 2

salehinejad
źródło