【问题标题】:Bounded cumulative sum in python without loopingpython中的有界累积和没有循环
【发布时间】:2021-07-04 16:36:00
【问题描述】:

我需要进行有界的累积求和 - 有点像电容器的充电状态。它不能超过其最大充电量,也不能低于 0。类似于:

Initial  Cumulative Sum Constrained Sum
 1        1               1
 7        8               8
 5        13              10
 -8       5               2
 -7       -2              0
 3        1               3

我有一段代码:

charge_0 = 0
for i in range (1, len(charge_discharge)):
    charge_1 = min(battery_size,max(0,(charge_0+charge_discharge[i])))
    StorageSOC.append(charge_1)
    charge_0 = charge_1

它比其他一些选项运行得更快,但我知道它没有优化。一个简单的累积总和要快几个数量级,所以我相信有更好的方法来做到这一点。我不能只在边界处应用剪辑。没有 for 循环的正确方法是什么?

【问题讨论】:

  • 你的数据结构是什么?它是列表列表,还是更适合像熊猫数据框这样的快速并行数据操作
  • 因为裁剪元素 N 会影响之后的所有总和。
  • Pranav:现在我将数据作为一个列表,因为我正在循环并在数组中查找索引会减慢该过程。但是,我不受任何特定格式的约束。这个问题与您提到的帖子有关,我在之前搜索时看到了这一点。但是,这涉及可以通过 groupby 完成的重置。我认为这不能使用 groupby (除非我遗漏了什么)。

标签: python performance for-loop cumulative-sum


【解决方案1】:

在示例中,未定义 j0 和 j1。这篇文章不涉及cumsum,请参考mwe以正确使用问题

在 numpy 或 pandas 上使用矢量方法可以更快,两者都有 cumsum 操作。

【讨论】:

  • 感谢您关注 j0 和 j1。我没有在这里发布很多问题,那些是原始代码中的占位符,我没有在帖子中解决这个问题。我已经在我的帖子中纠正了这个错误。但是, cumsum 并没有做我想做的事情。 cumsum 执行累积和,我需要修剪总和。我一直在寻找的是一种允许剪辑的矢量方法。
  • 这个stackoverflow.com/questions/58518211/…可以帮助你吗?
【解决方案2】:

你不需要新旧。而且你正在跳过元素 0。这有点快,但我不相信你可以消除循环。

charge = 0
for delta in charge_discharge:
    charge = min(battery_size,max(0,charge+delta))
    StorageSOC.append(charge)

【讨论】:

  • 谢谢,我会做出改变的。但是,我认为必须使用诸如 itertools 之类的解决方案。我只是不知道它会是什么样子。
  • itertools 只是 for 循环的语法糖。你也许可以写得更紧凑,但它会同时执行。
  • 当我实施解决方案时,我意识到您的改进来自您正确删除了我留下的索引。我继承了代码并删除了大部分问题,但我错过了那个。
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2023-03-18
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多