0

什么是 python 模块来计算二进制图像中的个数?

改写,

我有一个只有 1 和 0 的矩阵,它是 numpy 数组类型,我想知道有多少。

4

4 回答 4

8

您可以简单地使用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
于 2012-07-12T00:28:01.420 回答
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,这将很有用;否则为真。

于 2012-07-12T13:02:59.643 回答
0

由于您只有 1 和 0,您可以将它们全部加在一起:

import numpy as np
import operator as op

count_of_ones = reduce(op.add, np.ravel(your_array))
于 2012-07-12T00:29:53.650 回答
0

对于一种更有效的方法(与 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 倍。如果您使用非常大的阵列并且需要良好的性能,这是一个很好的方法。

于 2013-01-18T19:12:42.040 回答