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?
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?
Odpowiedzi:
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 bool
odpowiedź specyficzna. Mówiąc bardziej ogólnie, możesz użyć numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
i Python bool
nie są takie same, ale są one zgodne (patrz tutaj , aby uzyskać więcej informacji).
numpy.count_nonzero
w NumPy v1.5.1: masz rację. Zgodnie z tym ogłoszeniem o wydaniu dodano go w NumPy v1.6.0.
numpy.count_nonzero
jest 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)"
np.sum(bools)
! Jest jednak np.count_nonzero(bools)
nadal ~ 12 razy szybszy.
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 True
wartości w list
:
>>> sum([True,True,True,False,False])
3
Ale to nie zadziała:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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