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

使用SymPy lambdify生成曲面图时遇TypeError与SympifyError求助

问题分析与解决:SymPy lambdify处理NumPy数组报错

问题描述

使用SymPy的lambdify定义函数后,传入NumPy数组计算曲面值时触发TypeError: unhashable type 'numpy.ndarray',进而引发SympifyError。相关代码如下:

import numpy as np
import plotly.graph_objects as go
import sympy as sym

sym.init_printing()

# 定义曲面及其单位法向量
u,v = sym.symbols('u v')
surface_expr = -sym.sqrt(1-u**2-v**2)
# 关键:此处指定了modules=['sympy']
surface = sym.lambdify([u,v], surface_expr, modules = ['sympy'])

# 绘制曲面
uplot = np.outer(np.linspace(-0.5, 0.5, 100), np.ones(100))
vplot = uplot.T      
zplot = surface(uplot,vplot)  # 报错行

colorscale = 'oryel'
fig = go.Figure()
fig.add_surface(x=uplot, y=vplot, z=zplot, colorscale = colorscale)
fig.update_traces(showscale=False)

报错核心片段:

TypeError: unhashable type: 'numpy.ndarray'
...
SympifyError                              Traceback (most recent call last)
...
File <lambdifygenerated-1>:2, in _lambdifygenerated(u, v)
      1 def _lambdifygenerated(u, v):
----> 2     return -sqrt(-u**2 - v**2 + 1)

原因分析

lambdify的modules参数指定为['sympy']时,生成的函数会调用SymPy的符号运算函数(比如sympy.sqrt),而非NumPy的数值运算函数。SymPy函数设计用于处理符号变量,不支持直接传入NumPy数组(数组属于不可哈希类型,无法被SymPy的缓存机制处理),因此触发报错。

解决方法

修改lambdify的modules参数,让生成的函数使用NumPy的数值运算接口,支持数组输入:

方案1:指定modules为'numpy'

将lambdify的调用改为:

surface = sym.lambdify([u,v], surface_expr, modules='numpy')

方案2:使用默认参数(推荐)

lambdify默认会自动优先选择数值计算库(如NumPy),省略modules参数即可:

surface = sym.lambdify([u,v], surface_expr)

修改后,生成的函数会调用numpy.sqrt,可以正常处理NumPy数组,计算曲面值并完成绘图。

内容的提问来源于stack exchange,提问作者juan zaragoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:50:31