使用累加器列出理解

时间:2013-11-26 16:24:15

标签: python list-comprehension

使用列表推导(或其他紧凑方法)复制这个简单函数的最佳方法是什么?

import numpy as np

sum=0
array=[]
for i in np.random.rand(100):
   sum+=i
   array.append(sum)

3 个答案:

答案 0 :(得分:8)

在Python 3中,您使用itertools.accumulate()

from itertools import accumulate

array = list(accumulate(rand(100)))

累积得出输入迭代值的运行结果,从第一个值开始:

>>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

您可以将另一个操作作为第二个参数传递;这应该是一个可调用的,它获取累积的结果和下一个值,返回新的累积结果。 operator module非常有助于为这类工作提供标准的数学运算符;你可以用它来产生一个运行的乘法结果,例如:

>>> import operator
>>> list(accumulate(range(1, 10), operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

该功能很容易向后移植到旧版本(Python 2或Python 3.0或3.1):

# Python 3.1 or before

import operator

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    total = next(it)
    yield total
    for element in it:
        total = func(total, element)
        yield total

答案 1 :(得分:4)

由于您已使用numpy,因此可以使用cumsum

>>> from numpy.random import rand
>>> x = rand(10)
>>> x
array([ 0.33006219,  0.75246128,  0.62998073,  0.87749341,  0.96969786,
        0.02256228,  0.08539008,  0.83715312,  0.86611906,  0.97415447])
>>> x.cumsum()
array([ 0.33006219,  1.08252347,  1.7125042 ,  2.58999762,  3.55969548,
        3.58225775,  3.66764783,  4.50480095,  5.37092001,  6.34507448])

答案 2 :(得分:1)

好的,你说你不想要numpy,但无论如何这里是我的解决方案。 在我看来,你只是采用累积和,因此使用cumsum()函数。

import numpy as np
result = np.cumsum(some_array)

对于一个随机的例子

result = np.cumsum(np.random.uniform(size=100))