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

如何统计一维numpy数组的连续递增长度并生成同形数组

统计一维NumPy数组中连续递增子数组的长度并生成同形状结果数组

给定一个整体呈递减趋势但包含少量递增区域的一维NumPy数组,需要生成一个与输入形状完全相同的数组,其中每个位置的值表示该元素所在连续递增子数组的长度(递减或非递增位置记为0)。例如:
输入数组:[9, 8, 7, 9, 6, 5, 6, 7, 8, 4, 3, 1, 2, 3, 0]
预期输出:[0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 0]

方法一:基于重置点索引计算

核心思路是先定位所有非递增的"重置点",再通过计算每个位置与最近重置点的距离得到连续递增长度:

import numpy as np

def count_consecutive_increases(y: np.ndarray) -> np.ndarray:
    # 生成递增掩码:当前元素大于前一个元素则为True,第一个元素与自身比较,结果为False
    mask = np.diff(y, prepend=y[0]) > 0
    # 获取所有非递增位置(重置点)的索引
    reset_points = np.where(~mask)[0]
    # 为每个位置找到最近的重置点索引
    idx = np.searchsorted(reset_points, np.arange(len(y)), side='right') - 1
    # 当前索引减去最近重置点索引,得到连续递增长度
    return np.arange(len(y)) - reset_points[idx]

方法二:基于累积和与重置值计算

通过对递增掩码的累积和,结合累积最大值重置,实现分段累加:

import numpy as np

def count_consecutive_increases(y: np.ndarray) -> np.ndarray:
    # 生成递增掩码
    mask = np.diff(y, prepend=y[0]) > 0
    # 对掩码做累积和
    cumsum = np.cumsum(mask)
    # 记录每个重置点的累积和值,非重置点记为0
    reset_vals = np.where(~mask, cumsum, 0)
    # 计算累积的最大重置值,用于后续抵消非递增段的累积和
    max_reset = np.maximum.accumulate(reset_vals)
    # 最终结果为当前累积和减去最近的重置累积值
    return cumsum - max_reset

测试验证

运行示例代码:

y = np.array([9, 8, 7, 9, 6, 5, 6, 7, 8, 4, 3, 1, 2, 3, 0])
c = count_consecutive_increases(y)

print(y)
print(c)

输出结果与预期一致:

[9 8 7 9 6 5 6 7 8 4 3 1 2 3 0]
[0 0 0 1 0 0 1 2 3 0 0 0 1 2 0]

内容的提问来源于stack exchange,提问作者Jake Levi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:05:14