6

私は、プログラムをCERNROOTの深さからPythonに変換しようとするのはやや不幸な立場にあります。ROOTコード(CINT自体は忌まわしいimoです)では、ROOTがこれらを「文字列」として定義する方法により、数学関数を「文字列」として格納し、フィッティングやプロットなどのためにROOTに渡すことができます。

現時点では、数学関数は1行として単純なテキストファイルに保存されています。

(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])

よろしくお願いします。

4

1 に答える 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
于 2011-12-26T23:37:41.070 に答える