2011-12-26 22 views
6

मैं कुछ हद तक दुर्भाग्यपूर्ण स्थिति में हूं कि एक कार्यक्रम को सीईआरएन रूट से लेकर पायथन तक गहराई से बदलने की कोशिश करें। रूट कोड में (स्वयं में सीआईएनटी एक घृणित आईएमओ है), कोई भी गणितीय कार्यों को "स्ट्रिंग" के रूप में संग्रहीत कर सकता है और इसे रूट, प्लॉटिंग इत्यादि के लिए आरओटी के साथ पास कर सकता है क्योंकि रूट इन्हें "स्ट्रिंग्स" के रूप में कैसे परिभाषित करता है।पायथन/न्यूम्पी/सिस्सी - स्ट्रिंग को गणितीय फ़ंक्शन में कनवर्ट करना

फिलहाल, गणितीय कार्य, एक पंक्ति के रूप में सरल पाठ फ़ाइलों में जमा हो जाती है अर्थात

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

और फिर सी द्वारा तारों के रूप में निकाले जाते हैं ++ जब फ़ाइल में पढ़ने। क्या अजगर में कुछ समान है? मैं 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.TF1' बना सकते हैं ++ –

उत्तर

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 
संबंधित मुद्दे