循环中的累积加法
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]
【讨论】:
以上是关于循环中的累积加法的主要内容,如果未能解决你的问题,请参考以下文章