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

mad*_*ast 6 python numpy scipy root-framework

我有点不幸尝试将程序从CERN ROOT的深度转换为python.在ROOT代码中(CINT本身就是一个憎恶的imo),人们可以将数学函数存储为"字符串"并将它们传递给ROOT以进行拟合,绘图等,因为ROOT将这些定义为"字符串".

目前,数学函数作为一条线存储在简单的文本文件中,即

(1+[1])^(1+[1])/TMath::Gamma(1+[1]) * x^[1]/[0]^(1+[1]) * exp(-(1+[1])*x/[0])
Run Code Online (Sandbox Code Playgroud)

然后在读取文件时由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])
Run Code Online (Sandbox Code Playgroud)

提前感谢一堆.

unu*_*tbu 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]))
Run Code Online (Sandbox Code Playgroud)

回报

0.360894088631
Run Code Online (Sandbox Code Playgroud)