NumPy bool 배열에서 실제 요소 수를 계산하는 방법


답변:


261

여러 옵션이 있습니다. 두 가지 옵션은 다음과 같습니다.

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
고마워, 데이빗 그들은 깔끔하게 보입니다. sum (..)을 사용하는 메소드에 대해 True는 항상 파이썬에서 1과 같거나 적어도 numpy에서? 보장되지 않으면 미리 'if True == 1 :'인 확인을 추가합니다. count_nonzero (..)에 대해서는 불행히도 버전 1.5.1의 numpy 모듈에서 구현되지 않은 것으로 보이지만 나중에 사용할 수 있습니다.
norio dec

4
@norio 관련 bool: 산술 연산에서 부울 값은 1과 0으로 처리됩니다. Python 표준 라이브러리 문서에서 " 부울 값 "을 참조하십시오 . NumPy bool와 Python bool은 동일하지 않지만 호환 가능합니다 ( 자세한 내용 은 여기 참조 ).
David Alber

1
@norio numpy.count_nonzeroNumPy v1.5.1 에 있지 않은 것에 관해서 는 : 당신이 맞습니다. 이 릴리스 발표 에 따르면 NumPy v1.6.0에 추가되었습니다.
David Alber

25
FWIW numpy.count_nonzero는 적어도 파이썬 인터프리터에서 약 1000 배 빠릅니다. 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)여전히 ~ 12 배 빠릅니다.
mab

29

그 질문은 나에게 매우 비슷한 질문을 해결했으며 공유해야한다고 생각했습니다.

원시 파이썬에서는 다음의 값 sum()을 계산 하는 데 사용할 수 있습니다 .Truelist

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

그러나 이것은 작동하지 않습니다 :

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

먼저 배열 배열을 "평평하게"해야합니다. 불행하게도, 어떤 내장 방법이 없다, 참조 stackoverflow.com/questions/2158395/...
토미 chheng

2
기 illa 감사합니다! Pandas 데이터 프레임과도 호환됩니다.
JJFord3 2009

4

두 개의 numpy 배열을 비교하고 일치 횟수를 계산하는 관점 (예 : 기계 학습의 올바른 클래스 예측)에서 두 가지 차원에 대한 아래 예제가 유용하다는 것을 알았습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.