如何基于列表中的符号变化(过零点)提取相邻过零点间的列表元素?
解决提取列表符号突变间片段的问题
嘿,我来帮你搞定这个提取过零点(符号突变)间片段的需求!先看看你原代码里的几个小踩坑点,再给你修正后的完整方案:
原代码的问题梳理
- 函数定义语法错误:
def list_excluder:缺少参数和正确的缩进结构,应该写成带参数的def list_excluder(arr): - 数组索引逻辑错误:你用了
list_1[i],但你的List_1是一维数组,不是二维的,不需要循环i;而且zero_crossings[i-1]:zero_crossings[i]在i=0时会出现负索引,直接报错 - 输入列表笔误:
-20.33-17.11会被Python当成减法运算(结果是-37.44),应该改成-20.33, -17.11才符合你的预期
修正后的完整代码
import numpy as np def list_excluder(arr): # 处理0的符号问题:把0替换为最近的非零符号,避免误判为符号变化 signs = np.sign(arr) non_zero_idx = np.where(signs != 0)[0] # 全零情况直接返回空列表 if len(non_zero_idx) == 0: return [] # 填充0的符号为前一个非零符号 corrected_signs = np.copy(signs) for i in range(len(corrected_signs)): if corrected_signs[i] == 0: # 找到前面最近的非零符号索引 prev_non_zero = non_zero_idx[non_zero_idx < i][-1] if any(non_zero_idx < i) else non_zero_idx[0] corrected_signs[i] = corrected_signs[prev_non_zero] # 找到真正的正负突变位置(仅1↔-1的变化) sign_changes = np.where(np.diff(corrected_signs) != 0)[0] ls = [] if len(sign_changes) == 0: # 没有符号突变,返回整个列表 ls.append(arr.tolist()) else: # 第一段:从列表开头到第一个突变点(包含突变点前的元素) ls.append(arr[0 : sign_changes[0]+1].tolist()) # 中间段:处理多个突变点的情况 for i in range(1, len(sign_changes)): ls.append(arr[sign_changes[i-1]+1 : sign_changes[i]+1].tolist()) # 最后一段:从最后一个突变点到列表结尾 ls.append(arr[sign_changes[-1]+1 : ].tolist()) return ls # 修正笔误后的输入列表 List_1 = np.array([-1.,-0.89, -0.77,-0.667, -0.55, -0.44,-0.333, -0.22, -0.111,0.,1,1.333,1.66,2,2.3,2.66,3.3, 3.667, 4,-30,-26.77,-23,-20.33,-17.11,-13.8,-10,-7.44,-4.22, -1.,30,37.5,45,52.5,60]) # 调用函数得到结果 result = list_excluder(List_1) print(result)
代码逻辑说明
- 处理0的符号:
np.sign(0)会返回0,这会导致误判为符号变化。我们把0替换成前面最近的非零符号,这样负→0→正会被视为连续的一段,不会被拆分。 - 定位符号突变:只检测
正↔负的真正突变(忽略0的过渡),得到突变点的索引。 - 分割列表:根据突变点把列表拆分为「开头到第一个突变点」「突变点之间的片段」「最后一个突变点到结尾」三部分,完美匹配你的预期结果。
运行结果
执行代码后,你会得到期望的片段列表:
[ [-1.0, -0.89, -0.77, -0.667, -0.55, -0.44, -0.333, -0.22, -0.111, 0.0, 1.0, 1.333, 1.66, 2.0, 2.3, 2.66, 3.3, 3.667, 4.0], [-30.0, -26.77, -23.0, -20.33, -17.11, -13.8, -10.0, -7.44, -4.22, -1.0, 30.0, 37.5, 45.0, 52.5, 60.0] ]
内容的提问来源于stack exchange,提问作者Creature Galley
相关产品推荐
相关产品推荐

