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


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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.