不同长度numpy数组绘制的两条曲线交点求解问题
两条不等长数据点曲线求交点的解决方法
核心解决逻辑:你当前报错是因为两条曲线的y数组长度不一致,且x坐标没有对齐,无法直接做差运算。解决核心是将点数少的曲线插值到点数多的曲线的x坐标体系下,得到长度一致的y数组再计算交点。

你提交的原始代码存在两处问题:
pd.read_csv("test1.csv",,skiprows=range(9),names=['A', 'B', 'C','D'])行多写了一个逗号,会触发语法错误- 直接对长度不等的y1、y2做差,触发广播报错,错误信息如下:
operands could not be broadcast together with shapes (674,) (14,)
修改后可运行的完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 修正多余逗号的语法错误 df = pd.read_csv("test1.csv", skiprows=range(9), names=['A', 'B', 'C','D']) df2 = pd.read_csv("test2.csv", skiprows=range(1), names=['X','Y']) # 直接取values即可得到numpy数组,无需转list再转换 x1 = df['A'].values y1 = df['D'].values x2 = df2['X'].values y2 = df2['Y'].values # 核心步骤:将第二条曲线插值到第一条曲线的x坐标上,得到等长的y序列 y2_interp = np.interp(x1, x2, y2) # 现在可以正常做差找符号变化的位置,也就是交点位置 idx = np.argwhere(np.diff(np.sign(y1 - y2_interp))).flatten() fig, ax = plt.subplots() ax.plot(x1, y1, 'blue', label='曲线1') ax.plot(x2, y2, 'red', label='曲线2') # 可选:在图上直接标出识别到的交点 ax.scatter(x1[idx], y1[idx], c='green', s=60, zorder=10, label='交点') ax.legend() plt.show()
扩展说明
- 上述方案用的是numpy内置的线性插值,对于绝大多数平滑曲线找交点的需求足够使用。如果需要更高阶的插值效果,可以使用scipy的
interp1d方法实现二次、三次样条插值。 - 上述方法得到的交点是匹配x1坐标点的近似值。如果需要更精确的交点坐标,可以在找到idx对应的x区间后,在区间内对两条曲线做线性拟合求解精确交点。
内容的提问来源于stack exchange,提问作者Don99
相关产品推荐
相关产品推荐

