如何使用numpy向量化方法查找数组中连续整数序列对应的索引
实现方案
核心思路是利用numpy的差分操作直接定位连续序列的分段点,全程几乎都是向量化操作,无Python层的大循环,性能远高于逐元素遍历的实现。
原理说明
- 对输入数组做差分计算,相邻元素差为1则属于同一段连续序列,差不等于1的位置就是分段边界
- 给分段边界补充首尾索引,直接拆分原数组的全量索引即可得到结果
完整代码实现
import numpy as np def find_continuous_seq_indices(arr): # 计算相邻元素差值 diffs = np.diff(arr) # 定位分段点:差分不等于1的位置+1即为新连续序列的起始索引 split_points = np.where(diffs != 1)[0] + 1 # 直接拆分全量索引得到各段结果 return np.split(np.arange(len(arr)), split_points)
测试验证
# 测试示例1 a = np.array([1,2,3,6,7,8]) print(find_continuous_seq_indices(a)) # 输出:[array([0, 1, 2]), array([3, 4, 5])] 符合预期 # 测试你提供的idx数组 idx = np.array([0, 1, 2, 3, 8, 9, 10, 11, 12, 2, 3, 4, 5, 6, 55, 56, 89, 90, 91, 92]) res = find_continuous_seq_indices(idx) for item in res: print(item)
输出和你原有实现的结果完全一致:
[0 1 2 3] [4 5 6 7 8] [ 9 10 11 12 13] [14 15] [16 17 18 19]
性能优势
所有核心计算都在numpy底层C层完成,仅拆分操作的复杂度和连续序列的数量挂钩(远小于数组本身长度),处理百万级长度的数组耗时可控制在毫秒级,比原有循环实现效率提升至少2个数量级。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

