2012-07-12 17 views

回答

7

您可以簡單地使用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 

由於布爾變量有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 
0

既然你只有1和0,你可以只添加它們放在一起:

import numpy as np 
import operator as op 

count_of_ones = reduce(op.add, np.ravel(your_array)) 
+0

python3中的減少被guido認爲是過時的,如果我沒有弄錯,轉移到functools上 – 2012-07-12 00:36:40

+0

很高興知道,謝謝。 – mVChr 2012-07-12 00:38:19

+0

@DonQuestion是正確的。然而,它仍然有用,而且確實在'functools'中 - 無論如何2to3工具會重寫它,而在某些版本的2.x(可能是2.7)'reduce'和'functools.reduce'完全相同的情況下。我認爲它不會像3.4內建的東西那樣消失(但是不要在那個引用我!) – 2012-07-12 00:46:12

1

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,這將會有用;否則爲真。

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倍。如果您使用非常大的陣列並需要良好的性能,這是一個很好的方法。