什么是 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
由于对于 False/True,bool 的整数值为 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,这将很有用;否则为真。
由于您只有 1 和 0,您可以将它们全部加在一起:
import numpy as np
import operator as op
count_of_ones = reduce(op.add, np.ravel(your_array))
对于一种更有效的方法(与 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 倍。如果您使用非常大的阵列并且需要良好的性能,这是一个很好的方法。