2012-04-12 10 views
7

Ich habe den folgenden Code:Kombination numpy mit 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 

Meine Frage den obigen Code verwandt ist, ich möchte ein Modell definieren, mit sympy wenn es möglich ist, danach in der Update-Funktion, um die sympy ersetzen Variablen mit den x-Werten. Ist es möglich? Wie kann ich das machen?

Antwort

12

Ich kann Ihnen zwei Lösungen vorschlagen.

Erstens gibt es DeferedVector, die für die Verwendung mit lambdify erstellt wurde:

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]] 

jedoch lambdify tut zu viel Magie für meinen Geschmack.

Eine weitere Option ist die .subs Methode verwenden:

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⎦ 

Sie können so das Wörterbuch für die Substitution erstellen:

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

Vergessen Sie nicht, dass alle Rückgabeobjekte Sympy-Matrizen sind. Um sie in numplige Arrays zu konvertieren, verwenden Sie einfach np.array(the_matrix_in_question) und vergessen Sie nicht, die dtype anzugeben, andernfalls wird standardmäßig dtype=object verwendet.

+0

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

+0

@TobiasKienzler, eigentlich mag ich 'lambdify' in seinem aktuellen Zustand nicht. Es ist eine verwickelte und unvorhersehbare Funktion, die nicht einmal einen klar definierten Anwendungsbereich hat. Manchmal gibt es sogar symbolische Objekte zurück, wenn der gesamte Punkt für numerische Auswertungen verwendet werden soll. – Krastanov

+0

Oh, das ist bedauerlich :-(Ich habe es noch nicht so oft benutzt, aber die Idee dahinter klingt wirklich großartig .... –