Python:在每个索引处对数组中所有先前值求和

6

我有一个数组:

my_array = [1, 4, 1, 13, 9]

我希望创建一个新数组,其中每个索引的值都是之前所有索引值的总和。

summed_array = [0, 1, 5, 6, 19]

我尝试了类似于以下的内容

for ind,i in enumerate(my_array):
    print i, my_array[ind-1]

但是我无法弄清如何对所有先前的值进行求和。

3
你可以使用np.cumsum - Julien
7个回答

10
>>> from numpy import cumsum, ones
>>> a = ones(10)
>>> print(cumsum(a))
array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])

@IanAuld:这是在标签中,所以他们可能已经在使用它了。 - user2357112

3

以下是使用列表推导式的另一种以上变体:

[sum(my_array[0:i[0]]) for i in enumerate(my_array)]

enumerate很方便使用,因为它创建包含索引和该索引处值的元组。


2

一个纯Python实现:

def cumilative_sum(lst):
    total, result = 0, []
    for ele in lst:
        result.append(total)
        total += ele
    return result

3
当有线性时间解决方案时,请不要使用二次时间解决方案。 - user2357112
@user2357112,这个解决方案为什么是二次时间复杂度的? - undefined
@JohnK:请看编辑历史。我留下那条评论时,它是二次时间。 - undefined

2

itertools.accumulate 的功能与 numpy.cumsum 相同:

from operator import add
from itertools import accumulate
from operator import add

def cum_sum(l):
   return accumulate(l, add)

In [22]: list(cum_sum(my_array))
Out[22]: [1, 5, 6, 19, 28]

这将完全匹配cumsum。

如果你想忽略最后一个元素:

from operator import add
from itertools import islice, accumulate


def cum_sum(l, take):
   return accumulate(islice(my_array, 0, len(l)-take), add)

In [16]: list(cum_sum(my_array, 1))
Out[16]: [1, 5, 6, 19]

为了精确匹配您的输出,包括0,并且能在Python2或3中工作,您可以创建一个生成器函数:
my_array = [1, 4, 1, 13, 9]

def cum_sum(l):
    sm = 0
    for ele in l:
        yield sm
        sm += ele

输出:

In [5]: my_array = [1, 4, 1, 13, 9]

In [6]: list(cum_sum(my_array))
Out[6]: [0, 1, 5, 6, 19]

0
np.cumsum(my_array) - my_array

np.cumsum 返回一个累积和的数组,每个和都包括输入数组中对应元素及其之前的所有元素。如果你想要排除掉对应的元素,则只需将它们减去即可。


0

这里是一个简洁易懂的实现:

sum = 0

my_array = [1, 4, 1, 13, 9]
summed_array = [0, 0, 0, 0, 0]

for ind,i in enumerate(my_array):
    summed_array[ind] = sum
    sum += my_array[ind]

这段代码基本上是先将sum赋值为0并把它放进summed_array的第一个索引中,接着它将每个对应的my_array索引加到sum中。然后,它回到for循环,并用前面的sum分别给summed_array的每个索引赋值。

输出结果如下:

>>> summed_array

[0, 1, 5, 6, 19]

...这是最终预期的总和。

编辑:感谢@IanAuld,他提出了一种不需要枚举和将值初始化为0的方法:

sum = 0

my_array = [1, 4, 1, 13, 9]
summed_array = []

for i in my_array:
    summed_array += [sum]
    sum += i

创建一个单独的0列表并使用枚举和索引而不是直接使用列表中的值,这种方法的简洁之处在哪里? - kylieCatt
@IanAuld 是的,好建议!谢谢! - Patrick Yu

0

另一种方法可能是:

def cumulative(lst):

    cumulative= []
    for x in range(0, len(cumulative)):
        if x == 0:
            cumulative.append(lst[x])  # Establish the first element
        else:
            cumulative.append(accumulated[x - 1] + lst[x]) # Makes the cumulative sum

return cumulative

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接