【问题标题】:Using sympy with mayavi将 sympy 与 mayavi 一起使用
【发布时间】:2013-12-12 23:45:20
【问题描述】:

我有一个项目,我想在其中绘制一些使用 mayavi 进行 SymPy 操作的结果。特别是,我想在contour3d 中使用一些功能。这是我想出的,但它不起作用

#!/usr/bin/env python2

from sympy import *
from mayavi.mlab import *
from functools import partial
import numpy as np

def XYZ(f, xp, yp, zp):
  return f.evalf(subs={x:xp,y:yp,z:zp})


x, y, z = symbols('x y z')
r=x**2+y**2+z**2

F=partial(XYZ, r)

X, Y, Z = np.mgrid[-3:3:50j, -3:3:50j, -3:3:50j]

obj=contour3d(X, Y, Z, F)

但是,出现了两个错误(都来自 sympify)

1.) 如所写,错误是

ValueError: sequence too large; must be smaller than 32

2.) 减少点数(每个方向为 10 个)

ValueError: negative dimensions are not allowed

对让这样的事情起作用有什么想法吗?我认为这两个包会很好地结合在一起。

【问题讨论】:

    标签: sympy mayavi


    【解决方案1】:

    首先,我想指出,如果您为我们的绘图模块贡献一个 mayavi 后端(目前我们只有一个不适合 3d 的 matplotlib 后端),SymPy 团队将非常感激。

    您的问题的要点似乎是 numpy 和 sympy 不能很好地配合。基本上,你不应该期望(至少现在)sympy 的函数知道如何评估数组输入(它们不是 numpy 中所说的 ufunc)。

    目前解决这个问题的方法是使用lambdify。它有它的问题,但它运作良好。一个类似的但私有的函数,称为experimental_lambdify 用于 sympy 自己的绘图模块。见这里:

    https://github.com/sympy/sympy/blob/master/sympy/plotting/plot.py#L750

    特别是get_meshes()。或所有其他 get_something 方法。如果你很懒,你可以通过创建一个 sympy Plot 对象来重用它们,而无需在 matplotlib 中实际绘制它:

    your_plot_object = plot3d_parametric_surface(expr_x, expr_y, expr_z, range_u, range_v, show=False)
    the_single_geometrical_object_in_this_plot = your_plot_object[0]
    your_meshes = the_single_geometrical_object_in_this_plot.get_meshes()
    

    【讨论】:

    • 好吧,我给出了一个参数表面的例子,所以它不能直接在你的情况下工作,但你可以从 get_meshes() 复制粘贴适当的代码,然后从 sympy 导入其余代码当前绘图模块。同样,团队将感谢新的绘图后端的贡献。
    • 不幸的是,我现在不太可能熟练地实际实现这样的后端。不过,这将是一个非常酷的功能。
    • 是的,让 mayavi 与 SymPy 一起工作真是太棒了,尤其是现在 Anaconda 带有 mayavi,所以我可以在我的 Mac 上实际安装它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2021-12-30
    • 1970-01-01
    • 2020-03-05
    • 2013-08-22
    相关资源
    最近更新 更多