2016-04-07 6 views
1

2D numpy配列のFalse値を数える最も効率的な(そしてpythonの)方法は?私はこのような<code>np.array</code>で<code>False</code>値をカウントしようとしています

import numpy as np 
a = np.array([[True,True,True],[True,True,True],[True,False,False]]) 

私は通常、このメソッドを使用します。

number_of_false=np.size(a)-np.sum(a) 

は、より良い方法はありますか?これはそれを行うだろう

+0

です。 'numpy.count_nonzero'の使い方 –

+0

@AnttiHaapalaはnumpy.sum noを使用して同じですか?ただ真実を数えてください –

答えて

4

使用count_nonzero(例えばないFalse)の値非ゼロをカウントする:

>>> np.size(a) - np.count_nonzero(a) 
2 
+0

はい、これは私が多かれ少なかれ使う同じ解決策ではありませんか? –

+0

@GMパフォーマンス面でははるかに優れています。 – miradulo

+0

と私の小さなベンチマークからは、その程度の大きさです。 :) –

1

len(np.where(a==False))

はたぶん速いですか良く見て、他の方法があります。

1

1つの選択肢は、次のようになります。

np.bitwise_not(a).sum() 

でも短く、多分それほど明確ではない:

(~a).sum() 
4

明らかに明確なことは、必要なものを正確に尋ねることですが、それはそれを意味するものではありません最も効率的である:np.size(a) - np.count_nonzero(a)

で、

seq = [[True, True, False, True, False, False, False] * 10 for _ in range(100)] 
    a = np.array(seq) 

    np.size(a) - np.count_nonzero(a) 1000000 loops, best of 3: 1.34 µs per loop - Antti Haapala 
    (~a).sum()      100000 loops, best of 3: 18.5 µs per loop - Paul H 
    np.size(a) - np.sum(a)    10000 loops, best of 3: 18.8 µs per loop - OP 
    len(a[a == False])     10000 loops, best of 3: 52.4 µs per loop 
    len(np.where(a==False))   10000 loops, best of 3: 77 µs per loop - Forzaa 

明確な勝者は、大きさの順序によって、アンティHaapalaです:提案の回答でのpython 2.7でjupyter%%timeitを使用して

は明確な勝者を与えます

len(np.where(a==False))は、配列の入れ子構造によってペナルティを受けているようです。 1 D配列の同じベンチマークは10000 loops, best of 3: 27 µs per loop

+2

これらをコンパイルしていただきありがとうございます! –

関連する問題