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)
| 归档时间: |
|
| 查看次数: |
11306 次 |
| 最近记录: |