回答:
複数のオプションがあります。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
bool
:ブール値は算術演算では1および0として扱われます。Python標準ライブラリのドキュメントの「ブール値」をご覧ください。NumPy bool
とPython bool
は同じではありませんが、互換性があることに注意してください(詳細については、こちらを参照してください)。
numpy.count_nonzero
NumPy v1.5.1に含まれていないことについて:あなたは正しい。このリリース発表によれば、NumPy v1.6.0で追加されました。
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)"
np.sum(bools)
代わりに比較する必要があります!ただし、np.count_nonzero(bools)
それでも約12倍高速です。
その質問は私にとって非常に似た質問を解決し、私は共有する必要があると思いました:
未加工のpython では、aの値sum()
をカウントするために使用できます。True
list
>>> sum([True,True,True,False,False])
3
しかし、これはうまくいきません:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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