1

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

3 回答 3

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]
于 2013-11-07T11:48:00.033 回答
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,它是一个布尔数组,在用作权重时评估为1s 和s,即忽略评估为 的值。0False

于 2013-11-07T11:49:16.120 回答
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]
于 2013-11-07T11:48:20.573 回答