python在每个索引处对数组中以前的所有值求和
我有一个数组:python在每个索引处对数组中以前的所有值求和,python,python-2.7,numpy,sum,Python,Python 2.7,Numpy,Sum,我有一个数组: 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] 但无法计算出如何对所有以前的值求和。纯Python实现: >>> from numpy import cumsum, ones &
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]
但无法计算出如何对所有以前的值求和。纯Python实现:
>>> from numpy import cumsum, ones
>>> a = ones(10)
>>> print(cumsum(a))
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
def cumilative_sum(lst):
total, result = 0, []
for ele in lst:
result.append(total)
total += ele
return result
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]
np.cumsum
返回一个累加和数组,每个累加加加到并包括输入数组中的相应元素。要从总和中排除相应的元素,只需将它们减去即可。以下是一个简明易懂的实现:
def cumilative_sum(lst):
total, result = 0, []
for ele in lst:
result.append(total)
total += ele
return result
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]
代码基本上开始用0分配sum,并将其放入summated\u数组
的第一个索引中,然后将my\u数组
的各个索引相加。然后,它返回到for
循环,并用前面的sum
为summated\u数组的每个索引赋值
产出将是:
>>> 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
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]
在此,使用列表ComperExtension的上述另一个变体:
[sum(my_array[0:i[0]]) for i in enumerate(my_array)]
enumerate使用起来很方便,因为它创建的元组包含索引和该索引处的值您可以使用np.cumsum
@IanAuld:它在标记中,所以他们可能已经在使用它了。当线性时间解很容易时,请不要使用二次时间解决方案。创建一个单独的0列表并使用枚举和索引而不是直接使用列表中的值有什么简明之处?@IanAuld是的,很好的建议!谢谢