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

绘制双变量对数函数时出现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会直接导致对数计算失败。

修正方案

我给你调整了代码,主要改了这几点:

  1. 把math.log换成numpy原生的np.log2(专门计算以2为底的对数,天生支持数组运算)
  2. 把x、y的取值范围改成正数区间(避开0和负数)
  3. 去掉了没必要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:33:13