如何获取列表中每个列表的平均值,避免某些值?

时间:2013-11-07 11:43:28

标签: python numpy

如何在列表中单独计算每个列表的值的平均值,避免使用特殊值(-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]

3 个答案:

答案 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]