绘制双变量对数函数时出现TypeError错误的技术求助
解决双变量对数函数绘图的TypeError问题
嘿,我来帮你搞定这个报错!你碰到的TypeError: only size-1 arrays can be converted to Python scalars,核心原因很明确:
math.log是Python标准库的函数,只能处理单个数值(标量),但你传给它的X和Y是meshgrid生成的二维numpy数组,自然会报错。- 另外还有个隐藏坑:对数函数的真数必须大于0,你现在把x、y的范围设成了-100到100,负数和0会直接导致对数计算失败。
修正方案
我给你调整了代码,主要改了这几点:
- 把
math.log换成numpy原生的np.log2(专门计算以2为底的对数,天生支持数组运算) - 把x、y的取值范围改成正数区间(避开0和负数)
- 去掉了没必要的
np.vectorize(numpy函数本身就能处理数组,vectorize反而会降低效率)
修正后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D %matplotlib notebook def f10(x,y): # 用np.log2替代math.log,支持数组运算 return x * np.log2(y) + y * np.log2(x) # 修正定义域:只取正数,避开0(防止log(0)报错) x = np.linspace(0.1, 100, 100) y = np.linspace(0.1, 100, 100) X, Y = np.meshgrid(x, y) Z = f10(X,Y) # 绘制3D曲面图 fig = plt.figure(figsize=(10,10)) ax = plt.axes(projection='3d') surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='jet', edgecolor='none') ax.set_title("Surface", fontsize=13) ax.set_xlabel('x', fontsize=11) ax.set_ylabel('y', fontsize=11) ax.set_zlabel('Z', fontsize=11) fig.colorbar(surf) # 绘制等高线图 fig, ax = plt.subplots(1) p = ax.contour(X, Y, Z) fig.colorbar(p) plt.xlabel('x') plt.ylabel('y') plt.show()
额外说明
- 如果你需要自定义对数的底数,也可以用
np.log(y)/np.log(base)的方式,同样支持数组运算。 - 一定要注意对数函数的定义域,真数必须严格大于0,不然不仅会报错,结果也没有数学意义。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

