バイナリイメージ内の1の数をカウントするPythonモジュールとは何ですか?
言い換えれば、
1と0しかない行列があり、それはnumpy配列型であり、いくつあるか知りたいです。
あなたは単に使用することができますsum
:
>>> import numpy
>>> n = numpy.random.randint(0, 2, size=(3,3))
>>> n
array([[1, 0, 1],
[0, 1, 1],
[1, 1, 1]])
>>> n.sum()
7
boolsのFalse/Trueの整数値は0/1であるため、配列に0または1以外の要素が含まれている場合でも、このトリックの変形を使用できます。
>>> n = numpy.random.randint(0, 3, size=(3,3))
>>> n
array([[2, 2, 0],
[0, 2, 0],
[1, 1, 0]])
>>> n == 1
array([[False, False, False],
[False, False, False],
[ True, True, False]], dtype=bool)
>>> (n == 1).sum()
2
np.count_nonzero()は、バイナリ行列に対しても機能します。
In [1]: n = np.random.randint(0, 2, size=(3,3))
In [2]: n
Out[2]:
array([[0, 1, 1],
[0, 0, 0],
[0, 1, 1]])
In [3]: np.count_nonzero(n)
Out[3]: 4
これは、0がFalseを意味する場合に役立ちます。それ以外の場合はTrue。
(sum()アプローチと比較して)それを行うための非常に効率的な方法については、インデックスを使用する方が適切です。例えば:
import datetime
a = datetime.datetime.now()
sum(spindle_gold)
b = datetime.datetime.now()
len(spindle_gold[(spindle_gold).astype(bool) ] )
c = datetime.datetime.now()
与える
0:00:02.155000 0:00:00.025000 3870970
したがって、この方法は約100倍高速です。非常に大きなアレイを使用していて、優れたパフォーマンスが必要な場合は、このアプローチが適しています。
1と0しかないので、それらをすべて一緒に追加できます。
import numpy as np
import operator as op
count_of_ones = reduce(op.add, np.ravel(your_array))