2013-06-03 36 views
6

Tôi đang cố gắng thay thế hai ký hiệu trong phương trình của tôi cho dạng ma trận của mỗi biểu tượng.Làm thế nào để thay thế biểu tượng cho ma trận bằng cách sử dụng symPy và numPy

Tôi tạo ra một chức năng chuyển mạch được hình thành biểu hiện của tôi:

t, vS, = sy.symbols('t, vS', commutative = False) 
hS = t + vS 

eta = myComm(t,hS) 

dHs = myComm(eta,hS) 
print dHs.expand() 

năng suất khái niệm chính xác tôi muốn:

2*t*vS*t + t*vS**2 - t**2*vS - 2*vS*t*vS - vS*t**2 + vS**2*t 

Vì vậy, bây giờ tôi muốn thay thế những biểu tượng t và VS với ma trận, tuy nhiên khi sử dụng subs tôi nhận được một lỗi, "unhashable type: 'list'" Tôi giả sử nó có liên quan đến việc khởi tạo các ma trận hoặc cách chúng được thay thế đúng như tôi mới dùng cho cả hai numPy và symPy.

Phần còn lại của các mã:

tRel = ([e0, 0],[0,e1]) 
vtmp = ([v0, v1],[v2,v3]) 

dHs = dHs.subs(t, tRel) 
dHs = dHs.subs(vS, vtmp) 
print dHs 
+0

Hãy thử sử dụng 'MatrixSymbol'. – asmeurer

Trả lời

4

Có lẽ sử dụng lambdify:

import sympy as sy 
import numpy as np  
from sympy.abc import x, y 

z = ((x+y)**2).expand() 
print(z) 
# x**2 + 2*x*y + y**2 
X = np.arange(6).reshape(2,3) 
Y = np.arange(1,7).reshape(2,3)  

f = sy.lambdify((x, y), z, 'numpy') 
print(f(X, Y)) 
# [[ 1 9 25] 
# [ 49 81 121]] 

assert np.allclose(f(X, Y), (X**2 + 2*X*Y + Y**2)) 
+0

Điều đó làm việc hoàn hảo cho các ma trận số! Cảm ơn! Bất kỳ ý tưởng làm thế nào để đạt được một mục tiêu tương tự nhưng với (tham khảo mã của bạn ở trên) X và Y được bao gồm các biểu tượng chứ không phải là các yếu tố số? – faceforest

+0

Đối với điều đó, hãy sử dụng [phương thức phụ] (http://docs.sympy.org/dev/modules/core.html#sympy.core.basic.Basic.subs). – unutbu

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