Python/Numpy/Scipy - 将字符串转换为数学函数

6
我很不幸地需要将一个来自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])

谢谢提前帮忙。

你可以从Python中调用ROOT函数,因此你可以像在C++中一样在Python中创建ROOT.TF1 - Ruggero Turra
1个回答

9

假设你可以信任这些字符串不含有恶意代码,你可以构建一个字符串来定义一个函数来评估表达式,并使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接