我有一个数组:
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]
但是我无法弄清如何对所有先前的值进行求和。
我有一个数组:
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]
>>> from numpy import cumsum, ones
>>> a = ones(10)
>>> print(cumsum(a))
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
以下是使用列表推导式的另一种以上变体:
[sum(my_array[0:i[0]]) for i in enumerate(my_array)]
enumerate很方便使用,因为它创建包含索引和该索引处值的元组。
一个纯Python实现:
def cumilative_sum(lst):
total, result = 0, []
for ele in lst:
result.append(total)
total += ele
return result
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]
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]
np.cumsum(my_array) - my_array
np.cumsum
返回一个累积和的数组,每个和都包括输入数组中对应元素及其之前的所有元素。如果你想要排除掉对应的元素,则只需将它们减去即可。
这里是一个简洁易懂的实现:
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
另一种方法可能是:
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
np.cumsum
。 - Julien