如何在列表中分别计算每个列表的平均值,避免特殊值(-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]
A = [[4,5,7,8,-999],[3,8,5,7,-999]]
M = [sum(z)/float(len(z)) for z in [[x for x in y if x != -999] for y in A]]
print M
输出
[6.0, 5.75]
正如你提到的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
,它是一个布尔数组,在用作权重时评估为1
s 和s,即忽略评估为 的值。0
False
使用生成器函数,无需在内存中创建新列表:
A = [[4,5,7,8,-999],[3,8,5,7,-999]]
def solve(lis, val):
for item in lis:
c = item.count(val) #count number of -999 in list
total = sum(item) - (val*c) #subtract it from total sum
yield float(total)/ (len(item) - c) #return mean
print list(solve(A, -999))
#[6.0, 5.75]