In my research I am currently using both Python/Scipy and Mathematica, the former for data evaluation and the latter for symbolic computations. I currently have to transfer symbolic expressions computed in Mathematica to Python and evaluate them for given parameters – something I didn’t find a satisfying solution right away.
In order not to translate simple expressions by hand each time I was looking for a MathML/Latex to Python parser. Apparently Sympy offers MathML parsing, but I found a workaround, allowing you to copy/paste lengthy Mathematica expressions into your py code and evaluate them efficiently, using scipy.weave and Mathematica’s CForm.
- In Mathematica use CForm[Expression] to get a C version of your expression (using custom Mathematica functions, e.g. Power).
- Either copy the header file mdefs.h from Mathematica/SystemFiles/IncludeFiles/C to /usr/local/include or change the reference in the snippet below – I like my headers in one place.
- Then use scipy.weave.inline(code,args) to compile and execute your C code, but be sure to include the mdefs.h header. I wrote a quick wrapper for this:
[code lang=”python”]
from scipy import weave
def evalcform(code,argdict):
return weave.inline(‘#include “mdefs.h”\n’+code,
argdict.keys(),
local_dict=argdict,
include_dirs=[“/usr/local/include”])
[/code] - You can now pass code and a dictionary of variables and values to the wrapper, which will be passed on to the compiled expression and evaluated. E.g.:
[code lang=”python”]
code = “””
return_val = Power(A,2) + Power(B,0.5)*Sin(C*Pi);
“””
vars = {‘A’:2.,’B’:2.,’C’:.5}
print mathematica.evalcform(code,vars)
[/code]
which (probably) evaluates to
[Code]5.41421356237[/Code]
Note that the C code will only be compiled once, until the code (not the values of your variables) changes, which is quite fast for plotting for example. Also mind this is only a fast workaround, and will work only for expressions involving standard trigonometrical, exponential and power functions (have a look into the mdefs.h for an overview).
E Muller
Nice one!
John
Thanks – this saved me from some terrible regex/substitution/eval() nightmare!