Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python在每个索引处对数组中以前的所有值求和_Python_Python 2.7_Numpy_Sum - Fatal编程技术网

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是的,很好的建议!谢谢