如何在列表中分别计算每个列表的平均值,避免出现特殊值(-999)?
A = [[4,5,7,8,-999],[3,8,5,7,-999]]
M = [sum(x)/len(x) for x in [y for y in A if y!= -999]
print (M)
有什么想法吗???
为了获得最佳速度:有人可以更正以下代码吗? @alexanderlukanin13
M = [np.mean(L [L!=-999])for L in A]
请您参考如下方法:
正如您提到的numpy:
>>> import numpy as np
>>>
>>> A = [[4,5,7,8,-999],[3,8,5,7,-999]]
>>> M = [np.mean([x for x in L if x > -999]) for L in A]
>>> print M
[6.0, 5.75]
编辑
正如您提到速度是一项重要要求,您可以这样做:
>>> B = np.array(A)
>>> np.average(B, axis=1, weights=B!=-999)
array([ 6. , 5.75])
一切都发生在 numpy(即 C)空间中,这应该非常快。
稍微解释一下发生了什么:
np.mean(A, axis=1) 和等效的 np.average(A, axis=1) 计算数组列的平均值,即每一行的均值向量,这就是你想要的。 average允许使用权重:我们使用B!=-999,这是一个 bool 数组,使用时评估为1和0作为权重,即忽略评估为 False 的值。
