Pandas Interval区间重叠检测失效问题求助
问题
我有一个包含bbox信息的pandas DataFrame,坐标以x0、y0、x1、y1表示。目标是编写高性能代码检测不同bbox是否重叠,仅依赖向量化操作。尝试用pandas.Interval和pandas.Interval.overlaps方法时遇到异常错误。
已编写的代码:
ts = original_df.copy() ts['x0_prev'], ts['x1_prev'] = ts.x0.shift(), ts.x1.shift() ts['x_range'] = pd.IntervalIndex.from_arrays(ts.x0, ts.x1) ts['x_range_prev'] = pd.IntervalIndex.from_arrays(ts.x0_prev, ts.x1_prev) ts['x_range_prev_alternative'] = ts.x_range.shift(1)
生成的DataFrame及数据类型符合预期。用apply方法能实现逻辑,但处理大文件时速度极慢:
ts['overlap'] = ts.apply(lambda x : x['x_range'].overlaps(x['x_range_prev']),axis=1)
以下几种向量化写法均无法运行,提示无法对Series执行overlaps操作,其中from_arrays写法抛出NotImplementedError:
ts['overlap'] = ts.x_range.overlaps(ts.x_range_prev) ts['overlap'] = pd.IntervalIndex.from_arrays(ts.x0, ts.x1).overlaps(pd.IntervalIndex.from_arrays(ts.x0_prev, ts.x1_prev)) ts['overlap'] = pd.Interval(ts.x_range).overlaps(pd.Interval(ts.x_range_prev))
高性能向量化解决方案
直接用数值计算替代Interval的overlaps方法,完全基于pandas向量化运算,性能远高于apply循环:
bbox的重叠逻辑可拆解为x轴和y轴分别满足重叠条件:
- x轴重叠:当前bbox的左边界小于前一个bbox的右边界,且当前bbox的右边界大于前一个bbox的左边界
- y轴重叠:当前bbox的上边界小于前一个bbox的下边界,且当前bbox的下边界大于前一个bbox的上边界(根据坐标定义调整,若y0是顶部则逻辑一致)
完整代码实现:
# 先计算x轴重叠情况 x_overlap = (ts['x0'] < ts['x1_prev']) & (ts['x1'] > ts['x0_prev']) # 计算y轴重叠情况(若只检测x轴可忽略这一步) y_overlap = (ts['y0'] < ts['y1_prev']) & (ts['y1'] > ts['y0_prev']) # 最终bbox重叠:x和y轴同时满足重叠 ts['overlap'] = x_overlap & y_overlap
关于Interval方法的问题说明
pandas的IntervalIndex.overlaps方法目前仅支持与单个Interval对象比较,不支持两个IntervalIndex逐元素配对比较,因此会抛出NotImplementedError。而数值计算的方式完全避开了这个限制,同时利用pandas的向量化优势,处理大文件时速度提升显著。
内容的提问来源于stack exchange,提问作者qoob
相关产品推荐
相关产品推荐

