在Python中将总和累加到一个数组上

时间:2018-10-10 18:42:37

标签: python pandas rolling-sum

给我一​​个数组X,并要求我返回另一个数组Y,其中y [t] = x [t] + x [t-1]和y [0] = 0 不使用for循环在Python中。

我能想到的是使用滚动总和,但是我不确定这是否是最快的方法,因为我需要将x转换为数据帧/一系列以便滚动才能工作。有更快的方法吗?谢谢!

df = pd.DataFrame(X).rename(columns={0: 'X'})
df['Y'] = df['X'].rolling(2).sum().fillna(0)
Y = df['Y'].values

3 个答案:

答案 0 :(得分:1)

您可以使用列表推导和zip

x = [1, 2, 3, 4]
y = [0] + [c + n for c, n in zip(x, x[1:])]
print(y)

输出

[0, 3, 5, 7]

此方法依赖于内置函数,因此无需导入外部模块(如熊猫)。

答案 1 :(得分:1)

如果您要寻找一种衬纸,可能无法获得最佳性能

from toolz.itertoolz import sliding_window
[0]+map(sum,list(sliding_window(2, [1, 2, 3, 4]))) # [0, 3, 5, 7]

答案 2 :(得分:0)

好吧,您仍然可以使用numpy,尽管那样仍然可以将列表变成数组。

y = x + np.roll(x, 1)
y[0] = 0    

这是快速,简短,相当透明的方法,并且不(明确地)使用for循环。

您还可以使用map,它与列表理解几乎相同,并且不需要任何外部库。

y = 0 + map(lambda (a, b): a+b, zip(x, x[1:]))

在Python3中,这不起作用,相反,您需要编写:

y = [0] + list(map(lambda a: a[0]+a[1], zip(x, x[1:])))

y = [0] + list(map(sum, zip(x, x[1:])))