我有一个数组:
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]
但想不出如何求出之前所有值的总和。
mwyxok5s1#
>>> from numpy import cumsum, ones >>> a = ones(10) >>> print(cumsum(a)) array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
l0oc07j22#
一个纯Python实现:
def cumilative_sum(lst): total, result = 0, [] for ele in lst: result.append(total) total += ele return result
jogvjijk3#
因此,使用列表理解的上述的另一种变体:
[sum(my_array[0:i[0]]) for i in enumerate(my_array)]
枚举使用起来很方便,因为它创建了包含索引和该索引处的值的元组
mcvgt66p4#
itertools.accumulate的工作方式与numpy.cumsum相同:
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]
knpiaxh15#
np.cumsum(my_array) - my_array
np.cumsum返回一个累加和数组,每个和都指向并包括输入数组中的相应元素。您希望从总和中排除相应的元素,因此只需将它们减去即可。
np.cumsum
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
my_array
for
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
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
7条答案
按热度按时间mwyxok5s1#
l0oc07j22#
一个纯Python实现:
jogvjijk3#
因此,使用列表理解的上述的另一种变体:
枚举使用起来很方便,因为它创建了包含索引和该索引处的值的元组
mcvgt66p4#
itertools.accumulate
的工作方式与numpy.cumsum
相同:这将与累积量完全匹配。
如果要忽略最后一个元素:
要精确匹配您的输出(包括0)并在python2或3中工作,您可以创建一个生成器函数:
产出:
knpiaxh15#
np.cumsum
返回一个累加和数组,每个和都指向并包括输入数组中的相应元素。您希望从总和中排除相应的元素,因此只需将它们减去即可。jpfvwuh46#
以下是一个简明且易于理解的实现:
代码基本上从0开始赋值sum,并将其放入
summed_array
的第一个索引中,然后将my_array
的每个索引相加到sum中。然后,它返回到for
循环,并将summed_array
的每个索引分配给前一个sum
。输出将为:
...这是最终的预期金额。
**编辑:**谢谢@IanAuld,他建议了另一种方法,不需要枚举,不需要将值初始化为0:
8ftvxx2r7#
另一种说法可能是: