2011-12-26 37 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