2011-12-26 198 views
6

我在尝试将程序从CERN ROOT深度转换为python的过程中处于某种不幸的地位。在ROOT代码中(CINT本身就是一种憎恶),可以将数学函数存储为“字符串”,并将它们传递给ROOT进行拟合,绘图等,因为ROOT将这些定义为“字符串”。Python/Numpy/Scipy - 将字符串转换为数学函数

此刻,所述数学函数存储在简单的文本文件作为一行,即

(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]) 

感谢一堆事先。

+0

你可以叫蟒蛇ROOT功能,因此您可以创建Python中的'ROOT.TF1',如C++ – 2015-01-24 23:13:44

回答

8

因为,大概你可以相信这些字符串是非恶意的,你可以建立一个字符串来定义一个函数来计算表达式并使用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