numpy 在每个索引处,对数组中所有先前的值求和

g2ieeal7  于 2022-11-10  发布在  其他
关注(0)|答案(7)|浏览(157)

我有一个数组:

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

并希望创建一个新的数组,对于my_array中的每个索引,该数组是所有先前索引值的总和

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

我试过像这样的东西

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

但想不出如何求出之前所有值的总和。

mwyxok5s

mwyxok5s1#

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

l0oc07j22#

一个纯Python实现:

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

jogvjijk3#

因此,使用列表理解的上述的另一种变体:

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

枚举使用起来很方便,因为它创建了包含索引和该索引处的值的元组

mcvgt66p

mcvgt66p4#

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]

这将与累积量完全匹配。
如果要忽略最后一个元素:

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]
knpiaxh1

knpiaxh15#

np.cumsum(my_array) - my_array

np.cumsum返回一个累加和数组,每个和都指向并包括输入数组中的相应元素。您希望从总和中排除相应的元素,因此只需将它们减去即可。

jpfvwuh4

jpfvwuh46#

以下是一个简明且易于理解的实现:

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,并将其放入summed_array的第一个索引中,然后将my_array的每个索引相加到sum中。然后,它返回到for循环,并将summed_array的每个索引分配给前一个sum
输出将为:

>>> 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
8ftvxx2r

8ftvxx2r7#

另一种说法可能是:

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

相关问题