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)
提前感谢一堆.
因为,可能您可以信任字符串是非恶意的,您可以构建一个字符串,该字符串定义一个函数,该函数计算表达式并用于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)
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |