2011-12-26 39 views
6

Tôi đang ở vị trí hơi bất hạnh để cố gắng chuyển đổi một chương trình từ độ sâu của CERN ROOT thành python. Trong mã ROOT (CINT trong chính nó là một IMO abomination), người ta có thể lưu trữ các chức năng toán học như là một "chuỗi" và vượt qua các ROOT để phù hợp, âm mưu, vv vì ROOT định nghĩa chúng như là "chuỗi".Python/Numpy/Scipy - Chuyển chuỗi thành hàm toán học

Tại thời điểm này, các chức năng toán học được lưu trữ trong các tập tin văn bản đơn giản như một dòng, ví dụ:

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

và sau đó được tách ra như dây đàn bởi C++ khi đọc trong file. Có cái gì đó tương tự trong python? Tôi biết về numexpr, nhưng tôi không thể làm cho nó hoạt động tương đương với ở trên, tức là

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

Cảm ơn trước.

+0

bạn có thể gọi hàm ROOT từ trăn, vì vậy bạn có thể tạo ra một 'ROOT.TF1' trong python, như trong C++ –

Trả lời

8

Vì, có lẽ, bạn có thể tin tưởng các chuỗi không độc hại, bạn có thể xây dựng một chuỗi xác định hàm đánh giá biểu thức và sử dụng exec để thực hiện chuỗi đó dưới dạng câu lệnh. Ví dụ,

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

lợi nhuận

0.360894088631 
Các vấn đề liên quan