Python/Numpy/Scipy - 将字符串转换为数学函数
我现在面临一个有点麻烦的情况,需要把一个来自CERN ROOT的程序转换成Python。ROOT代码(我觉得CINT本身就是个怪物)允许我们把数学函数存储为“字符串”,然后可以把这些字符串传给ROOT进行拟合、绘图等操作,因为ROOT把这些定义为“字符串”。
目前,这些数学函数被简单地存储在文本文件中,每个函数占一行,比如:
(1+[1])^(1+[1])/TMath::Gamma(1+[1]) * x^[1]/[0]^(1+[1]) * exp(-(1+[1])*x/[0])
然后在用C++读取文件时,这些函数会被提取为字符串。请问在Python中有没有类似的功能?我知道有numexpr这个库,但我似乎无法让它和上面的内容等效地工作,也就是:
(1+p[1])**(1+p[1])/scipy.special.Gamma(1+p[1]) * x**p[1]/p[0]**(1+p[1]) * numpy.exp(-(1+p[1])*x/p[0])
非常感谢!
1 个回答
10
因为你可以相信这些字符串是安全的,所以你可以构建一个字符串,这个字符串定义了一个函数,用来计算表达式,然后用 exec
来执行这个字符串作为一条语句。例如,
import numpy as np
import scipy.special as special
expr='(1+p[1])**(1+p[1])/special.gamma(1+p[1]) * x**p[1]/p[0]**(1+p[1]) * np.exp(-(1+p[1])*x/p[0])'
def make_func(expr):
funcstr='''\
def f(x,p):
return {e}
'''.format(e=expr)
exec(funcstr)
return f
f=make_func(expr)
print(f(1,[2,3]))
返回
0.360894088631