【问题标题】:TypeError: Object of type 'Add' is not JSON serializable - Python GraphTypeError:“添加”类型的对象不是 JSON 可序列化的 - Python Graph
【发布时间】:2020-09-23 22:30:43
【问题描述】:

我正在尝试创建函数的切线逼近。但是,试图找到一种将其绘制在图表顶部的方法。这两个函数都可以工作,但是当我绘制函数时,我想出了类型错误“'Add' 类型的对象不是 JSON 可序列化的”

x = sp.Symbol("x")
y = sp.Symbol("y")
f = 1*(np.e**(-2*(((x**2 + y**2)**(1/2))-1))-2*np.e**(-1*(((x**2 + y**2)**(1/2))-1)))
fx = f.diff(x)
fy = f.diff(y)
x = np.linspace(-5,5,50)
y = np.linspace(-5,5,50)
[xx,yy] = np.meshgrid(x,y)
ff = 1*(np.e**(-2*(((xx**2 + yy**2)**(1/2))-1))-2*np.e**(-1*(((xx**2 + yy**2)** 
(1/2))-1)))
uu = f.subs(x,2).subs(y,2) + fx.subs(x,2).subs(y,2)*(xx) + fy.subs(x,2).subs(y,2)*(yy)


import plotly.graph_objects as go
fig = go.Figure(data=[go.Surface(x=xx,y=yy,z=uu),go.Surface(x=xx,y=yy,z=ff)])
fig.show()

错误发生在最后一行代码。

【问题讨论】:

  • 检查您的 uu 变量。我怀疑它是一个sympy 对象(Add),而不是数字(numpy 数组),因为ffxxyy 是。我不熟悉plotly,但显然它无法处理这个sympy 对象。
  • 您会发现很多 SO 答案/cmets 警告不要同时使用 numpysympy。你有 plotly 的额外复杂性。
  • 您正在用 2 代替 sp.Symbol 对象用 2 替换 np.linspace 对象。您需要重命名 linspace 对象或将 uu 移动到 linspace 对象的定义上方。我也强烈建议不要在 sympy 表达式中使用 numpy 函数。而是使用sp.exp(...)。我还建议在替换之后执行.evalf(),以便在进一步操作之前删除所有 sympy 对象。

标签: python arrays json numpy sympy


【解决方案1】:

问题与您的系数有关(f.subs(x,2).subs(y,2)fx.subs(x,2).subs(y,2)fy.subs(x,2).subs(y,2))。系数的类型为<class 'sympy.core.numbers.Float'>,与numpy 数组的计算不兼容。您可以使用float() 命令转换系数。

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2019-11-21
    • 2021-11-13
    • 2018-09-22
    相关资源
    最近更新 更多