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

数组突变点检测:去噪及单边缘仅检测一次问题

数组突变点检测问题

给定数组:

[
-670.0790336045966,
 -670.079352863881,
 -664.7769001654013,
 -662.655094599744,
 -662.6557553135007,
 -662.6551031804399,
 -667.966652577584,
 -670.0779722837389,
 -670.0789732042002]

需求:检测数组中的突变点,要求每个边缘仅检测一次并去除噪声,预期突变点索引为 [1, 3, 5, 7],但现有代码输出结果为 [1, 2, 3, 5, 6, 7]。

尝试的Python代码:

import numpy as np

array_L = [
-670.0790336045966,
 -670.079352863881,
 -664.7769001654013,
 -662.655094599744,
 -662.6557553135007,
 -662.6551031804399,
 -667.966652577584,
 -670.0779722837389,
 -670.0789732042002]

differences = np.abs(np.diff(array_L))

threshold = 1
distance = 1

change_points = np.where((differences > threshold) & (np.arange(len(array_L)-1) % distance == 0))[0] + 1
change_points1 = np.where((differences > threshold) & (np.arange(len(array_L)-1) % distance == 0))[0]

修正方案

现有代码的问题是:仅筛选差值超过阈值的点,但未区分连续突变段(同一段边缘的多次连续变化会被重复标记),也没识别出“段与段之间的边缘”(即突变的起始/结束点)。

通过检测一阶差分的状态变化(从“平稳”到“突变”或反之),可以精准定位每个边缘的唯一突变点,同时自动过滤噪声。修正后的代码如下:

import numpy as np

array_L = [
-670.0790336045966,
 -670.079352863881,
 -664.7769001654013,
 -662.655094599744,
 -662.6557553135007,
 -662.6551031804399,
 -667.966652577584,
 -670.0779722837389,
 -670.0789732042002]

# 计算相邻元素的绝对差值(一阶差分)
first_diff = np.abs(np.diff(array_L))
threshold = 1

# 标记每个差值是否属于显著突变(超过阈值)
is_significant = first_diff > threshold

# 找出状态发生变化的位置:从平稳到突变,或突变到平稳
# 这些位置对应原数组的段边缘索引
edge_indices = np.where(is_significant[:-1] != is_significant[1:])[0] + 1

print(edge_indices)  # 输出:[1 3 5 7]

代码说明

  1. 一阶差分:计算数组相邻元素的绝对差值,判断每个位置是否发生显著突变;
  2. 状态标记:用布尔数组标记每个差值是否超过阈值(区分“平稳”和“突变”状态);
  3. 边缘检测:寻找状态发生切换的位置,这些位置就是段与段之间的唯一边缘,对应原数组的突变点索引。

这种方法自动过滤了连续突变段的重复标记,同时小幅度噪声(未超过阈值的波动)不会触发状态变化,自然被排除。

内容的提问来源于stack exchange,提问作者Luan Dang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:17:10