循环中的累积加法

Posted

技术标签:

【中文标题】循环中的累积加法【英文标题】:Cummulative addition in a loop 【发布时间】:2018-11-14 14:55:47 【问题描述】:

我正在尝试将一个值累加到前一个值上,并且每次都将值存储在一个数组中。

此代码只是一个更大项目的一部分。为简单起见,我将按如下方式定义变量:

ele_ini = [12]
smb = [2, 5, 7, 8, 9, 10]

val = ele_ini
for i in range(len(smb)):
     val += smb[i]
     print(val)
     elevation_smb.append(val)

问题

每次将elevation_smb中存储的前一个值替换为当前值,这样我得到的结果是:

elevation_smb = [22, 22, 22, 22, 22, 22]

我期待的结果是

elevation_smb = [14, 19, 26, 34, 43, 53]

注意ele_ini 是一个包含 n 个元素的向量。为了简单起见,我只使用 1 个元素。

【问题讨论】:

np.cumsum(smb) + 12? @coldspeed - 检查最后一个注意事项 【参考方案1】:

不要使用循环,因为慢。更好的是下面的快速矢量化解决方案。

我认为需要numpy.cumsum 并为2d numpy array 添加矢量ele_ini

ele_ini = [12, 10, 1, 0]
smb = [2, 5, 7, 8, 9, 10]

elevation_smb  = np.cumsum(np.array(smb)) + np.array(ele_ini)[:, None]
print (elevation_smb)
[[14 19 26 34 43 53]
 [12 17 24 32 41 51]
 [ 3  8 15 23 32 42]
 [ 2  7 14 22 31 41]]

【讨论】:

@Rahul K P - 谢谢。【参考方案2】:

在您的情况下,向量似乎正在使用指针。这就是为什么它没有创造新的价值。尝试添加复制值的copy()

elevation_smb.append(val.copy())

【讨论】:

【参考方案3】:

使用reduce

In [6]: reduce(lambda c, x: c + [c[-1] + x], smb, ele_ini)
Out[6]: [12, 14, 19, 26, 34, 43, 53]

【讨论】:

以上是关于循环中的累积加法的主要内容,如果未能解决你的问题,请参考以下文章

R/dplyr:使用循环创建滞后并根据列名计算累积总和

cuda内核for循环中的Break语句给出了问题

输出累积每次迭代而不是重置[关闭]

无法使用 gprof 累积时间 - gnu 分析器

异步响应到javascript NodeJS中的循环

Java实现大数加法运算的几种方法