Python如何获取列表/序列/数据框中连续0/1区间首尾索引及对应值
实现方案
直接使用Numpy的差分运算即可快速实现,无需手动遍历序列,代码简洁且执行效率高:
import numpy as np # 原有数据生成逻辑 x = np.arange(0,4*np.pi,0.1) y = np.sin(x) # 原列表推导可替换为向量化运算,效率更高 limit = np.where((y > -0.25) & (y < 0.25), 1, 0) # 核心逻辑:查找连续1的起止索引 # 计算差分,补0处理首尾边界场景 diff = np.diff(limit, prepend=0, append=0) # 0转1的位置就是连续1的起始索引 start_indices = np.where(diff == 1)[0] # 1转0的位置往前挪1位,就是连续1的结束索引 end_indices = np.where(diff == -1)[0] - 1 # 获取对应x值 start_x = x[start_indices] end_x = x[end_indices] # 遍历输出结果 for s_idx, e_idx, s_x, e_x in zip(start_indices, end_indices, start_x, end_x): print(f"起始索引:{s_idx},对应x值:{s_x:.2f} | 结束索引:{e_idx},对应x值:{e_x:.2f}")
补充说明
- 运行上述代码可以得到示例中第一个区间的起止索引为29、33,和绘图代码里的垂直线位置完全匹配,符合需求。
- 如果需要取每个连续区间的偏移位置值,比如取第3个位置的x,直接用
x[start_indices + 2]即可。 - 如果你使用的Numpy版本低于1.16不支持
prepend/append参数,可以把差分逻辑替换为:diff = np.concatenate([[0], np.diff(limit), [0]]),效果完全一致。
内容的提问来源于stack exchange,提问作者Johannes Schwenzer
相关产品推荐
相关产品推荐

