2013-06-03 8 views
6

Próbuję zastąpić dwa symbole w moim równaniu dla postaci matrycowej każdego z nich.Jak zastąpić symbol macierzy za pomocą symPy i numPy

stworzyłem funkcję komutatora które utworzyły mój wyrażenie:

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

eta = myComm(t,hS) 

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

uzyskując prawidłową ekspresję chcę:

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

Więc teraz chcę zastąpić symbole T i VS z matryc, jednak kiedy używam podpórek, pojawia się błąd "unhashable type:" list "" Przypuszczam, że ma to związek z moją inicjalizacją macierzy lub z tym, jak należy je poprawnie zastąpić, ponieważ jestem nowy zarówno dla numPy, jak i dla symPy.

Reszta kodu:

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

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

Spróbuj użyć 'MatrixSymbol'. – asmeurer

Odpowiedz

4

Może używać 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

To zadziałało idealnie dla macierzy numerycznych! Dzięki! Każdy pomysł, jak osiągnąć ten sam cel, ale z (odnosząc się do powyższego kodu) X i Y składa się z symboli zamiast elementów numerycznych? – faceforest

+0

Do tego użyj [metody subsów] (http://docs.sympy.org/dev/modules/core.html#sympy.core.basic.Basic.subs). – unutbu

Powiązane problemy