计算非零值的平均值

Lui*_*uez 6 python optimization numpy list

我有一些列表,其中非零值的平均值是多少。

例如

 [2,2,0,0,0] -> 2    
 [1,1,0,1,0]  -> 1  
 [0,0,0,9,0] -> 9    
 [2,3,0,0,0] -> 2.5
Run Code Online (Sandbox Code Playgroud)

目前我正在这样做:

list_ = [1,1,0,1,0]  
non_zero = [float(v) for v in list_ if v>0]
averge = sum(non_zero)/len(non_zero)
Run Code Online (Sandbox Code Playgroud)

我怎样才能更有效地执行此操作?

roo*_*oot 11

如果你从一个 numpy 数组开始,你可以使用np.nonzero过滤数组,然后取平均值:

a = np.array([2,3,0,0,0])
average = a[np.nonzero(a)].mean()
Run Code Online (Sandbox Code Playgroud)

您还可以通过布尔索引进行过滤,这似乎更快:

average = a[a!=0].mean()
Run Code Online (Sandbox Code Playgroud)

您还可以轻松更改上述方法以使用a>0.

时间安排

使用以下设置:

a = np.random.randint(100, size=10**6)
Run Code Online (Sandbox Code Playgroud)

我得到以下时间:

%timeit a[a!=0].mean()
100 loops, best of 3: 4.59 ms per loop

%timeit a[a.nonzero()].mean()
100 loops, best of 3: 9.82 ms per loop
Run Code Online (Sandbox Code Playgroud)