NumPyブール配列の真の要素の数を数える方法


回答:


261

複数のオプションがあります。2つのオプションは次のとおりです。

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
ありがとう、David。彼らはきちんと見えます。sum(..)を使用するメソッドについて、Trueは常にpython(または少なくともnumpy)では1に等しいですか?保証されない場合は、事前に「if True == 1:」のチェックを追加します。count_nonzero(..)については、残念ながら、バージョン1.5.1のnumpyモジュールには実装されていないようですが、将来的には使用する可能性があります。
norio

4
@norioについてbool:ブール値は算術演算では1および0として扱われます。Python標準ライブラリのドキュメントの「ブール値」をご覧ください。NumPy boolとPython boolは同じではありませんが、互換性があることに注意してください(詳細については、こちらを参照してください)。
David Alber、2011

1
@norio numpy.count_nonzeroNumPy v1.5.1に含まれていないことについて:あなたは正しい。このリリース発表によれば、NumPy v1.6.0で追加されました。
David Alber

25
FWIWは、numpy.count_nonzero少なくとも私のPythonインタープリターでは、約1000倍高速です。 python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown 2013年

6
@chbrownあなたは正しいです。しかし、np.sum(bools)代わりに比較する必要があります!ただし、np.count_nonzero(bools)それでも約12倍高速です。
mab 2015年

29

その質問は私にとって非常に似た質問を解決し、私は共有する必要があると思いました:

未加工のpython では、aの値sum()をカウントするために使用できます。Truelist

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

しかし、これはうまくいきません:

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

最初に配列の配列を「フラット化」する必要があります。残念ながら、組み込みの方法はありません、見stackoverflow.com/questions/2158395/...
トミーchheng

2
ギヨーム、ありがとう!Pandasデータフレームでも動作します。
JJFord3 16

4

2つのnumpy配列を比較し、一致の数を数えること(たとえば、機械学習での正しいクラス予測)の観点から、2次元の以下の例が役立つことがわかりました。

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.