Python绘制3D方程遇类型错误:仅尺寸为1的数组可转换为标量
问题排查与解决方案
错误原因
你遇到的only size-1 array can be converted into scalars错误,核心原因是**math模块的函数仅支持标量运算**:
- 函数
f(x,y)中使用的math.cos、math.sqrt和math.e只能处理单个数值,但你传入的x_5、y_5是通过np.meshgrid生成的多维numpy数组,两者不兼容。
修复方案
将math模块的所有函数替换为numpy对应的函数——numpy的数学函数原生支持数组元素级运算,完美适配你的网格数据:
修正后的完整代码
import numpy as np # from sklearn.linear_model import LinearRegression # 当前绘图逻辑未用到,可注释/删除 import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d.axes3d import Axes3D def f(x,y): # 替换为numpy支持数组运算的函数 return np.cos(x) * np.cos(y) * np.exp(-np.sqrt(x**2 + y**2)/4) x_5 = np.linspace(start=-2, stop=2, num=200) y_5 = np.linspace(start=-2, stop=2, num=200) x_5, y_5 = np.meshgrid(x_5, y_5) # 绘图部分无修改 fig = plt.figure(figsize=(16, 15)) ax = fig.add_subplot(111, projection="3d") ax.set_xlabel("X", fontsize=18) ax.set_ylabel("Y", fontsize=18) ax.set_zlabel("z=f(X,Y), Cost Function", fontsize=18) ax.plot_surface(x_5, y_5, f(x_5,y_5), cmap=cm.coolwarm, alpha=0.5) plt.show()
关键修改点
- 移除
import math,改用numpy的数学函数:np.cos()、np.sqrt() - 将
math.e**(...)替换为np.exp(...)——这是numpy中计算指数的标准方式,比直接用np.e**更高效且可读性更强 - 可选优化:删除未使用的
LinearRegression导入,减少冗余
内容的提问来源于stack exchange,提问作者Haseeb Ahmad
相关产品推荐
相关产品推荐

