【问题标题】:Cummulative addition in a loop循环中的累积加法
【发布时间】:2023-03-25 14:48:01
【问题描述】:

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

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

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 - 检查最后一个注意事项

标签: python pandas loops numpy


【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2021-07-04
      相关资源
      最近更新 更多