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

Matplotlib绘制复函数3D图报错:'numpy.ndarray'对象不可调用

问题解决:复函数3D绘图的TypeError错误

错误原因

你遇到的TypeError: 'numpy.ndarray' object is not callable和虚部无关,核心问题是:

  • 你先基于一维的x和y计算出z,再通过z_abs = np.abs(z)得到了一个一维numpy数组,而非可调用的函数
  • 后续你错误地将这个数组当作函数z_abs(X, Y)调用,触发了类型错误

修复后的代码

import numpy as np
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
plt.style.use('seaborn-poster')
fig = plt.figure(figsize = (10,10))
ax = plt.axes(projection='3d')

# 生成一维坐标序列
x = np.arange(-23, 23, 0.1)
y = np.arange(-23, 23, 0.1)           

# 定义复函数参数
x1=25
y1=22
x2=15
y2=17
x3=25
y3=12
A1=np.exp(np.deg2rad(0.0) * 1j)
A2=np.exp(np.deg2rad(10.) * 1j)
A3=np.exp(np.deg2rad(20.) * 1j)

# 先生成二维网格坐标
X, Y = np.meshgrid(x, y)

# 基于二维网格计算复函数z
z = (2*A1*(y1-Y))/((x1-X)**2 + (y1-Y)**2) + \
    (2*A2*(y2-Y))/((x2-X)**2 + (y2-Y)**2) + \
    (2*A3*(y3-Y))/((x3-X)**2 + (y3-Y)**2)

# 计算复函数的模长作为Z轴数据
Z = np.abs(z)

# 绘制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
# 设置坐标轴标签
ax.set_xlabel('x', labelpad=20)
ax.set_ylabel('y', labelpad=20)
ax.set_zlabel('z', labelpad=20)

fig.colorbar(surf, shrink=0.5, aspect=8)

plt.show()

关键修改说明

  • 调整步骤顺序:先通过meshgrid生成二维网格X、Y,再用它们计算复函数,确保所有运算基于二维数组
  • 直接对二维复函数结果取模得到Z,避免将数组误当作函数调用
  • 用反斜杠拆分长表达式,提升代码可读性

内容的提问来源于stack exchange,提问作者SAHAR GOHARSHENASAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:16:02