Python 如何计算忽略特殊值的列表中值的平均值?
如何计算忽略特殊值(-999)的列表中值的平均值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
有什么想法吗?我不知道。但这会奏效的
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