如何统计一维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
相关产品推荐
相关产品推荐

