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