2011-12-26 15 views
6

Jestem w dość niefortunnej sytuacji, aby spróbować przekonwertować program z głębi CERN ROOT na Pythona. W kodzie ROOT (CINT samo w sobie jest obrzydliwością imo), można przechowywać funkcje matematyczne jako "ciąg" i przekazywać je do ROOT do dopasowania, kreślenia itp. Z powodu tego, jak ROOT definiuje je jako "łańcuchy".Python/Numpy/Scipy - Konwertowanie ciągu znaków na funkcję matematyczną

Obecnie funkcje matematyczne są przechowywane w prostych plikach tekstowych w postaci linii, tj

(1+[1])^(1+[1])/TMath::Gamma(1+[1]) * x^[1]/[0]^(1+[1]) * exp(-(1+[1])*x/[0]) 

a następnie ekstrakcji jako ciągi przez C++ przy wczytywaniu pliku. Czy jest coś podobnego w python? Znam numexpr, ale nie może wydaje się zmusić go do pracy z równowartości powyżej, tj

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

Dzięki pęczek wyprzedzeniem.

+0

można wywołać funkcję głównego z pytona, dzięki czemu można tworzyć 'ROOT.TF1' w Pythonie, jak w C++ –

Odpowiedz

8

Ponieważ, prawdopodobnie, można ufać, że łańcuchy nie są złośliwe, można utworzyć ciąg znaków, który definiuje funkcję, która ocenia wyrażenie i używa exec do wykonywania tego łańcucha jako instrukcji. Na przykład,

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

powraca

0.360894088631 
Powiązane problemy