Python 如何计算忽略特殊值的列表中值的平均值?

Python 如何计算忽略特殊值的列表中值的平均值?,python,numpy,Python,Numpy,如何计算忽略特殊值(-999)的列表中值的平均值 有什么想法吗?我不知道。但这会奏效的 A = [4,5,7,8,-999] A = [item for item in A if item != -999] print sum(A)/float(len(A)) 输出 6.0 [6.0, 5.75] 编辑: 要找到所有子列表的方法 A = [[4,5,7,8,-999],[3,8,5,7,-999]] M = [sum(z)/float(len(z)) for z in [[x for x

如何计算忽略特殊值(-999)的列表中值的平均值


有什么想法吗?

我不知道。但这会奏效的

A = [4,5,7,8,-999]
A = [item for item in A if item != -999]
print sum(A)/float(len(A))
输出

6.0
[6.0, 5.75]
编辑:

要找到所有子列表的方法

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
[6.0, 5.75]

我不知道numpy。但这会奏效的

A = [4,5,7,8,-999]
A = [item for item in A if item != -999]
print sum(A)/float(len(A))
输出

6.0
[6.0, 5.75]
编辑:

要找到所有子列表的方法

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
[6.0, 5.75]
性能

让我们测试三个代码片段:普通的
np.mean
屏蔽数组
和使用Python生成器的“朴素”解决方案。数组有1000000个值

from timeit import timeit
setup = 'import numpy as np; a=np.arange(0, 1000000)'
snippets = [
    'assert np.mean(a[a!=999999]) == 499999.0',
    'm=np.ma.masked_array(a,a==999999); assert np.ma.mean(m) == 499999.0',
    'assert sum(x for x in a if x != 999999)/999999 == 499999'
]
timings = [timeit(x, setup=setup, number=10) for x in snippets]
print('\n'.join(str(x) for x in timings))
结果:

0.0840559005737
0.0890350341797
10.4104599953
普通
np。平均值
掩蔽数组
的计时非常接近,而“朴素”解决方案的速度要慢100多倍

性能

让我们测试三个代码片段:普通的
np.mean
屏蔽数组
和使用Python生成器的“朴素”解决方案。数组有1000000个值

from timeit import timeit
setup = 'import numpy as np; a=np.arange(0, 1000000)'
snippets = [
    'assert np.mean(a[a!=999999]) == 499999.0',
    'm=np.ma.masked_array(a,a==999999); assert np.ma.mean(m) == 499999.0',
    'assert sum(x for x in a if x != 999999)/999999 == 499999'
]
timings = [timeit(x, setup=setup, number=10) for x in snippets]
print('\n'.join(str(x) for x in timings))
结果:

0.0840559005737
0.0890350341797
10.4104599953

普通
np.平均值
屏蔽数组
的计时非常接近,而“naive”解决方案的计时速度要慢100倍以上。

在numpy中,您可以使用屏蔽数组平均值:

import numpy as np
A = np.array([4,5,7,8,-999])
mask_A = A == -999
ma_A = np.ma.masked_array(A, mask_A)
print np.ma.mean(ma_A)
结果:

6.0 

在numpy中,可以使用遮罩数组表示:

import numpy as np
A = np.array([4,5,7,8,-999])
mask_A = A == -999
ma_A = np.ma.masked_array(A, mask_A)
print np.ma.mean(ma_A)
结果:

6.0 

谢谢但是,如何在列表中分别计算每个列表的值的平均值,以避免出现特殊值(-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]'列表的理解速度很快,但基于掩蔽数组和奇特的索引,这种解决方案应该比其他解决方案慢……谢谢。但是如何在列表中分别计算每个列表的值的平均值,避免出现特殊值(-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]'列表理解速度很快,但即使基于掩蔽数组和奇特的索引,这个解决方案应该比其他解决方案要慢……但对于速度测试和你对np的想法来说要慢得多!@AlexanderLukanin13顺便问一下,如何应用np.mean(a[a!=-999])的方法在多个数组的情况下,请看我的另一个问题@AlexanderLukanin13很多关于速度测试的问题,以及你对np.mean(a[a!=-999])!@AlexanderLukanin13顺便问一下,如何应用np.mean(a[a!=-999]))对于多个数组,请看我的另一个问题@AlexanderLukani13