2014-10-10 51 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