web-dev-qa-db-ja.com

NumPy bool配列の真の要素の数を数える方法

ブール型のNumPy配列 'boolarr'があります。値がTrueである要素の数をカウントします。このタスク専用のNumPyまたはPythonルーチンはありますか?または、スクリプト内の要素を反復処理する必要がありますか?

142
norio

複数のオプションがあります。次の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
208
David Alber

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

Raw pythonでは、sum()を使用してdictのTrue値をカウントできます。

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

しかし、これは機能しません:

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

たぶんこれは誰かを助けるでしょう。

26

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

3
salehinejad

行ごとのカウントを行う場合は、axis=1sumに指定します。

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

同様に、np.count_nonzeroの場合:

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])
3
cs95