如何在列表中单独计算每个列表的值的平均值,避免使用特殊值(-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]
答案 0 :(得分:3)
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]
答案 1 :(得分:3)
正如您所提到的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和0
s,即忽略评估的值为False
。
答案 2 :(得分:0)
使用生成器功能,无需在内存中创建新列表:
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]