You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib显示曲线交点?遇列表运算报错求助

解决Matplotlib曲线交点计算的问题

嘿,我来帮你搞定这个问题!你遇到的错误unsupported operand type(s) for -: 'list' and 'list'根源很清晰,同时代码里还有几个小细节需要调整,我一步步给你捋清楚:

错误原因拆解

  1. 列表不支持元素级运算:x、y、z都是从history['acc']获取的Python列表(list),而y - x这种减法操作只支持numpy数组的元素级运算,列表之间没法直接做相减操作。
  2. 代码笔误:你写的test2,.history['acc']多了一个逗号,应该改成test2.history['acc']。
  3. 曲线绘制逻辑混乱:你原来的plt.plot(x, y, '-')是把x的acc值当作x轴、y的acc值当作y轴,这和你之前单独绘制三条曲线的逻辑完全不一致(单独绘制时是把训练步数作为x轴、acc作为y轴),会导致坐标体系混乱,根本没法正确计算交点。

修正后的完整代码

import numpy as np
import matplotlib.pyplot as plt

# 修正笔误,同时将列表转换为numpy数组(关键!)
x = np.array(test1.history['acc'])
y = np.array(test2.history['acc'])
z = np.array(test3.history['acc'])

# 生成统一的x轴:对应训练的步数/Epochs
steps = np.arange(len(x))

# 按你原来正常运行的逻辑绘制三条acc曲线
plt.plot(steps, x, color='green', label='test1 acc')
plt.plot(steps, y, color='blue', label='test2 acc')
plt.plot(steps, z, color='orange', label='test3 acc')

# 计算x和y曲线的交点:找两条曲线acc值符号变化的位置
# np.diff(np.sign(y - x))会在曲线交叉时产生正负切换,argwhere定位这些位置的索引
idx = np.argwhere(np.diff(np.sign(y - x))).flatten()

# 绘制x和y的交点:x轴是步数,y轴是对应位置的acc值
plt.plot(steps[idx], y[idx], 'ro', label='x-y交点')

# 如果你还需要计算其他曲线的交点,用同样逻辑即可:
# idx_xz = np.argwhere(np.diff(np.sign(z - x))).flatten()
# plt.plot(steps[idx_xz], z[idx_xz], 'bo', label='x-z交点')

plt.legend()
plt.xlabel('训练步数/Epochs')
plt.ylabel('准确率(Accuracy)')
plt.title('多条Acc曲线及交点展示')
plt.show()

关键调整说明

  • 转成numpy数组:用np.array()把列表转成数组,这样才能支持y - x这种元素级的减法运算,这是解决报错的核心。
  • 统一x轴坐标:用steps变量表示训练的步数,让三条曲线的x轴保持一致,这样计算出来的交点才是真正意义上的曲线交叉点。
  • 修正交点绘制逻辑:原来的plt.plot(x[idx], y[idx],z[idx], 'ro')参数格式错误,正确的做法是指定x轴为steps[idx],y轴为对应曲线的acc值,用单个标记样式绘制。

这样调整后,代码就能正常计算并显示曲线的交点啦!

内容的提问来源于stack exchange,提问作者Tayyab Vohra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:24:38