2013-06-03 71 views
6

我試圖用我的方程中的兩個符號替換每個矩陣的矩陣形式。如何使用symPy和numPy替換矩陣的符號

我創建了形成自己的表情換向器功能:

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

eta = myComm(t,hS) 

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

得到正確的表達我想:

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

所以現在我要代替的符號T和VS與矩陣,但是當使用subs我得到一個錯誤,「不可互換的類型:'列表'」我認爲它必須做我的矩陣初始化或如何他們應該正確的替代,因爲我是新來的numPy和symPy。

的其餘代碼:

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

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

嘗試使用'MatrixSymbol'。 – asmeurer

回答

4

也許使用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

這對數值矩陣非常合適!謝謝!任何想法如何實現相同的目標,但是(參考上面的代碼)X和Y由符號而不是數字元素組成? – faceforest

+0

爲此,請使用[subs method](http://docs.sympy.org/dev/modules/core.html#sympy.core.basic.Basic.subs)。 – unutbu