如何使用np.sign检测zero crossing并提取两个列表的对应片段
实现方案
核心逻辑
- 先修正过零点检测函数的冗余代码,确保正确输出符号变化对应的索引
- 构造完整切分点序列:在过零点列表前后分别补充起始位置
0和列表总长度,覆盖首尾区间 - 遍历相邻切分点,对两个列表同步做切片操作,分别存入结果集合
完整可运行代码
import numpy as np # 修正后的过零点检测函数,移除冗余的for循环 def get_zero_crossings(arr1): # np.diff(np.sign(arr1))不为0的位置就是符号变化的过零点 zero_crossings = np.where(np.diff(np.sign(arr1)))[0] return zero_crossings.tolist() # 同步切分两个列表的函数 def sync_split_by_zero_crossing(arr1, arr2): zero_crossings = get_zero_crossings(arr1) # 构造完整切分点,补充首尾边界 split_points = [0, *zero_crossings, len(arr1)] res_list1 = [] res_list2 = [] # 遍历每一组相邻切分点,同步切片 for i in range(len(split_points)-1): start = split_points[i] end = split_points[i+1] res_list1.append(arr1[start:end]) res_list2.append(arr2[start:end]) return res_list1, res_list2 # 测试示例(修正了原示例的语法错误) if __name__ == "__main__": # 你给出的过零点示例 test_zero_crossing = [3,12,18] # 修正原list1的多余逗号,list2补充逗号分隔 list1 = [-12,-14,-16,-10,1,3,6,2,1,5,5,3,-1,-12,-2,-3,-5,-3,3,2,5,2] list2 = [0.00040409, 0.00041026, 0.0004162, 0.00042, 0.0005, 0.0006, 0.0007, 0.0008, 0.0009, 0.001, 0.00105, 0.0011, 0.00115, 0.0012, 0.00125, 0.0013, 0.00135, 0.0014, 0.00116538, 0.001096, 0.00102431, 0.0009] # 直接用你给出的过零点测试切分 split_points = [0, *test_zero_crossing, len(list1)] new_list1 = [] new_list2 = [] for i in range(len(split_points)-1): new_list1.append(list1[split_points[i]:split_points[i+1]]) new_list2.append(list2[split_points[i]:split_points[i+1]]) # 输出结果和你预期的结构一致 print("new_list1分段:", new_list1) # 如果你需要把所有分段拼接成一个大列表,执行以下代码即可 # merged_list1 = sum(new_list1, []) # merged_list2 = sum(new_list2, [])
注意事项
- 需保证输入的list1和list2长度完全一致,否则切片会出现错位
- 原示例中list1的
2,,1存在多余逗号、list2元素间未用逗号分隔,运行前需先修正语法错误
内容的提问来源于stack exchange,提问作者Creature Galley
相关产品推荐
相关产品推荐

