为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中对数组滚动求和

在 Python 中对数组滚动求和

郎朗坤 2021-07-06 13:16:29
我得到一个数组 X,我被要求返回另一个数组 Y,其中 y[t] = x[t] + x[t-1] 和 y[0] = 0,而不在 Python 中使用 for 循环。我能想到的是使用滚动总和,但我不确定这是否是最快的方法,因为我需要将 x 转换为数据帧/系列才能滚动工作。有没有更快的方法来做到这一点?谢谢!df = pd.DataFrame(X).rename(columns={0: 'X'})df['Y'] = df['X'].rolling(2).sum().fillna(0)Y = df['Y'].values
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

您可以使用列表理解和zip:


x = [1, 2, 3, 4]

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

print(y)

输出


[0, 3, 5, 7]

这种方式依赖于内置函数,因此无需导入pandas等外部模块。


查看完整回答
反对 回复 2021-07-13
?
SMILET

TA贡献1796条经验 获得超4个赞

如果您正在寻找单线可能无法提供最佳性能


from toolz.itertoolz import sliding_window

[0]+map(sum,list(sliding_window(2, [1, 2, 3, 4]))) # [0, 3, 5, 7]


查看完整回答
反对 回复 2021-07-13
?
函数式编程

TA贡献1807条经验 获得超9个赞

好吧,您可以使用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:])))


查看完整回答
反对 回复 2021-07-13
  • 3 回答
  • 0 关注
  • 623 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号