2012-04-12 34 views
7

Tôi có một đoạn mã sau:Kết hợp NumPy với sympy

p = classp(); 
for i in range(1,10): 
    x = numpy.array([[2],[4],[5]]) 
    print p.update(x) 

class classp: 
    def __init__(self): 
     self.mymodel = array([2*x[1]], [3*x[0]], [x[2]]); 
    def update(self, x): 
     return self.mymodel #replace x(0)...x(1) with the given parameter 

Câu hỏi của tôi có liên quan mã trên, tôi muốn xác định một mô hình sử dụng sympy nếu có thể, sau đó trong hàm cập nhật thay thế sympy biến với giá trị x. Có thể không? Làm thế nào tôi có thể làm điều đó?

Trả lời

12

Tôi có thể đề xuất cho bạn hai giải pháp.

Thứ nhất, có DeferedVector đã được tạo ra để sử dụng với lambdify:

In [1]: from sympy.matrices import DeferredVector 

In [2]: v = DeferredVector('v') 

In [3]: func = lambdify(v, Matrix([v[1], 2*v[2]])) 

In [4]: func(np.array([10,20,30])) 
Out[4]: 
     [[20] 
     [60]] 

Tuy nhiên lambdify không quá nhiều kỳ diệu cho tôi thích.

Một lựa chọn khác là sử dụng các phương pháp .subs:

In [11]: x1, x2, x3 = symbols('x1:4') 

In [12]: m = Matrix([x2,2*x1,x3/2]) 

In [13]: m.subs({x1:10, x2:20, x3:30}) 
Out[13]: 
     ⎡20⎤ 
     ⎢ ⎥ 
     ⎢20⎥ 
     ⎢ ⎥ 
     ⎣15⎦ 

Bạn có thể tạo các từ điển cho sự thay thế như thế:

dict(zip(symbols('x1:4'), your_value_array)).

Đừng quên rằng tất cả các đối tượng trả về là ma trận đáng sợ. Để chuyển đổi chúng thành các mảng có nhiều mảng chỉ sử dụng np.array(the_matrix_in_question) và đừng quên chỉ định dtype, nếu không nó sẽ mặc định là dtype=object.

+0

+1 cho [lambdify] (http://docs.sympy.org/dev/modules/utilities/lambdify.html) –

+0

@TobiasKienzler, thực sự tôi không thích 'lambdify' trong trạng thái hiện tại của nó. Nó là một hàm phức tạp và không thể đoán trước mà thậm chí không có phạm vi ứng dụng được xác định rõ ràng. Đôi khi nó thậm chí còn trả về các đối tượng tượng trưng khi toàn bộ điểm được sử dụng để đánh giá số. – Krastanov

+0

Ồ, điều đó thật không may :-(Tôi chưa từng sử dụng nó nhiều đến thế, nhưng ý tưởng đằng sau nó nghe rất hay .... –

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