如何计算列表中省略特殊值(-999)的值的平均值?
import numpy as np
A = [4,5,7,8,-999]
M = np.mean(A)
有什么想法吗???
请您参考如下方法:
>>> import numpy as np
>>> a = np.array([1,2,3,4,5])
>>> np.mean(a)
3.0
>>> np.mean(a[a<=3])
2.0
>>> np.mean(a[a!=4])
2.75
对于 OP 案例:
np.mean(A[A!=-999])
性能
让我们测试三个片段:普通 np.mean、masked_array 和使用 Python 生成器的“朴素”解决方案。数组有 1000000 个值。
from timeit import timeit
setup = 'import numpy as np; a=np.arange(0, 1000000)'
snippets = [
'assert np.mean(a[a!=999999]) == 499999.0',
'm=np.ma.masked_array(a,a==999999); assert np.ma.mean(m) == 499999.0',
'assert sum(x for x in a if x != 999999)/999999 == 499999'
]
timings = [timeit(x, setup=setup, number=10) for x in snippets]
print('\n'.join(str(x) for x in timings))
结果:
0.0840559005737
0.0890350341797
10.4104599953
普通 np.mean 和 masked_array 的时间很接近,而“朴素”的解决方案要慢 100 多倍。
