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 boolodpowiedź 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 booli Python boolnie są takie same, ale są one zgodne (patrz tutaj , aby uzyskać więcej informacji).
numpy.count_nonzerow NumPy v1.5.1: masz rację. Zgodnie z tym ogłoszeniem o wydaniu dodano go w NumPy v1.6.0.
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)"
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 Truewartoś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