2013-06-03 11 views
6

私はそれぞれの行列の式に2つの記号を代入しようとしています。しかし、私は行列を持つシンボルのトンとVSを代用したいだから今symPyとnumPyを使って行列をシンボルに置き換える方法

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

:私が欲しい正しい発現を生じる

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

eta = myComm(t,hS) 

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

は、私は私の表現を形成整流子関数を作成しましたサブタイプを使用しているときにはエラーが発生します。「unhashable type: 'list'」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メソッド](http://docs.sympy.org/dev/modules/core.html#sympy.core.basic.Basic.subs)を使用します。 – unutbu

関連する問題