2014-10-10 47 views
1

我經常需要查找滿足某個大的1D數組值的某些條件的值的數量。通過一個小試驗和錯誤我結束了以下方法:使用numpy查找數組中非零值的數量

import numpy as np 
a = np.random.random_sample(500000) # just some trial data 

num_above_half = len(np.nonzero(a > 0.5)[0]) 

等效的方法:

num_above_half = sum(a > 0.5) 

是我的機器上近300 X慢。第一種方法很好,但語法有點雜亂,有沒有更好的方法呢?

回答

0

我還沒有做任何基準測試,但np.count_nonzero呢?

+1

@mgilson:'np.count_nonzero'是對速度的贏家,這是在發佈者DSM聯詳述(5X加速v'LEN()'方法)。可能會像帝斯曼所暗示的那樣關閉。 – 2014-10-10 19:11:05

+0

@DSM - 是的,我認爲它很重要:-) – mgilson 2014-10-10 20:19:06

3

基準化不同的等價方法來計算某個條件表明np.count_nonzero是最快的。

In [2]: %timeit len(np.nonzero(a > 0.5)[0]) 
100 loops, best of 3: 2.24 ms per loop 

In [3]: %timeit sum(a > 0.5) 
1 loops, best of 3: 1.23 s per loop 

In [4]: %timeit (a > 0.5).sum() 
1000 loops, best of 3: 906 µs per loop 

In [5]: %timeit np.count_nonzero(a > 0.5) 
1000 loops, best of 3: 266 µs per loop