Python 以迭代方式高效地计算平均值
我有一长串整数:Python 以迭代方式高效地计算平均值,python,list,numpy,Python,List,Numpy,我有一长串整数: my_list = [10,13,42,23,12,45,33,59,12] 我想计算第一个I数字的平均值,对于0中的所有I,您只需创建一个生成器函数,该函数还允许通过将结果转换到列表中,一次过惰性地计算或生成列表,并使用枚举生成器生成当前元素随时间的计数 >>> def average_series(items): ... sum = 0 ... for i, item in enumerate(items, 1): ...
my_list = [10,13,42,23,12,45,33,59,12]
我想计算第一个
I
数字的平均值,对于0中的所有I
,您只需创建一个生成器函数,该函数还允许通过将结果转换到列表中,一次过惰性地计算或生成列表,并使用枚举
生成器生成当前元素随时间的计数
>>> def average_series(items):
... sum = 0
... for i, item in enumerate(items, 1):
... sum += item
... yield float(sum) / i
...
>>> list(average_series([10,13,42,23,12,45,33,59,12]))
[10.0, 11.5, 21.666666666666668, ..., 27.666666666666668]
您不必总是依赖于numpy来完成这样简单的事情。您可以简单地创建一个生成器函数,通过将结果强制转换到列表中,一次完成惰性计算或列表生成,并使用枚举
生成器随时间生成当前元素的计数
>>> def average_series(items):
... sum = 0
... for i, item in enumerate(items, 1):
... sum += item
... yield float(sum) / i
...
>>> list(average_series([10,13,42,23,12,45,33,59,12]))
[10.0, 11.5, 21.666666666666668, ..., 27.666666666666668]
对于这样简单的事情,您不必总是依赖numpy。如果您使用的是Python 3.2或更高版本,请参阅(如果您试图获得输入子集的运行平均值,请参阅itertools.islice)。例如,在您的情况下(获取输入中n-1
值的运行平均值):
如果您使用的是Python3.2或更高版本,请参阅(如果您试图获取输入子集的运行平均值,请参阅itertools.islice
)。例如,在您的情况下(获取输入中n-1
值的运行平均值):
使用numpy.cumsum
In [13]: import numpy as np
In [14]: my_list = [10,13,42,23,12,45,33,59,12]
In [15]: np.cumsum(my_list) / np.arange(1, len(my_list)+1, dtype=np.float)
Out[15]:
array([ 10. , 11.5 , 21.66666667, 22. ,
20. , 24.16666667, 25.42857143, 29.625 , 27.66666667])
使用numpy.cumsum
In [13]: import numpy as np
In [14]: my_list = [10,13,42,23,12,45,33,59,12]
In [15]: np.cumsum(my_list) / np.arange(1, len(my_list)+1, dtype=np.float)
Out[15]:
array([ 10. , 11.5 , 21.66666667, 22. ,
20. , 24.16666667, 25.42857143, 29.625 , 27.66666667])
注意:在您的特定情况下,如果列表已经在内存中,您可以直接切片my_list
,而不是使用islice
,例如sums=itertools.accumulate(my_list[:-1])
,但是如果输入来自某种类型的生成器,直接切片不起作用,您可能需要islice
。我不确定您是否需要切片,我得到的印象是OP想要整个列表(只是在问题中出错),但会等待OP确认。可能。该示例明确省略了最后一个值,对于所有0注意:在您的特定情况下,如果列表已经在内存中,您可以直接切片my_list
,而不是使用islice
,例如sums=itertools.accumulate(my_list[:-1])
,但是如果输入来自某种类型的生成器,直接切片不起作用,您可能需要islice
。我不确定您是否需要切片,我得到的印象是OP想要整个列表(只是在问题中出错),但会等待OP确认。可能。该示例显式忽略最后一个值,对于所有0