You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy实现跨数组时重置fmax.accumulate(无循环)

带重置条件的Numpy累积最大值计算

需求:计算数组long的累积最大值,当累积值(若不重置)大于等于对应位置的RsiMa数组值时,将该位置的累积结果设为long的当前值,并从此位置重新开始累积最大值计算。要求完全使用Numpy实现,禁止循环。

解决方案代码

import numpy as np

# 示例输入数据(可替换为实际数据)
RsiMa = np.array([4, 4, 4, 3, 5, 2, 1])
DeltaFastAtrRsi = RsiMa - np.array([1, 2, 3, 2, 4, 1, 0.5])
long = RsiMa - DeltaFastAtrRsi

# 1. 计算无重置的基础累积最大值
temp_acc = np.fmax.accumulate(long)
# 2. 生成重置掩码:标记需要重置累积的位置
reset_mask = temp_acc >= RsiMa
# 3. 计算每个位置的最近重置点(包括自身)
reset_idx = np.where(reset_mask, np.arange(len(long)), -1)
last_reset = np.maximum.accumulate(reset_idx)
# 修正首个位置的重置点(若未触发重置,设为起始索引0)
if not reset_mask[0]:
    last_reset[0] = 0
# 4. 定位所有新累积区间的起始位置
group_starts = np.where(last_reset[1:] != last_reset[:-1])[0] + 1
# 5. 修正累积最大值数组,在重置点处重新开始累积
longband = temp_acc.copy()
longband[group_starts] = long[group_starts]

print(longband)
# 输出结果:[1.  2.  3.  2.  4.  1.  0.5]

步骤解释

  1. 基础累积最大值:先用np.fmax.accumulate计算无任何重置的累积最大值,作为初始参考。
  2. 重置掩码:对比基础累积值与RsiMa,标记所有需要重置累积的位置。
  3. 最近重置点定位:通过np.maximum.accumulate为每个位置找到最近的重置触发点(包括自身),确定每个元素所属的累积区间。
  4. 区间起始定位:找到所有新累积区间的起始索引,这些位置需要重置累积值。
  5. 修正累积结果:将基础累积值在区间起始位置替换为long的当前值,得到符合要求的带重置累积最大值数组。

示例验证

针对题目给出的示例数据,运行代码后得到的结果与预期输出完全一致,满足重置后重新累积的要求。

内容的提问来源于stack exchange,提问作者Francesco Battisti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:10:50