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

6 投票
1 回答
2644 浏览
提问于 2025-04-17 09:02

我现在面临一个有点麻烦的情况,需要把一个来自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

撰写回答