2012-04-12 17 views
7

Ho un il seguente codice:Combinando NumPy con 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 

La mia domanda è legata al codice di cui sopra, vorrei definire un modello utilizzando sympy se è possibile, poi nella funzione di aggiornamento sostituire lo sympy variabili con i valori x. È possibile? Come lo posso fare?

risposta

12

Posso proporrvi due soluzioni.

In primo luogo, v'è DeferedVector che è stato creato per l'utilizzo con lambdify:

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

Tuttavia lambdify fa troppo magica per i miei gusti.

Un'altra opzione è quella di utilizzare il metodo .subs:

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⎦ 

È possibile creare il dizionario per la sostituzione del genere:

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

Non dimenticare che tutti gli oggetti di restituzione sono matrici sympy. Per convertirli in array numpy basta usare np.array(the_matrix_in_question) e non dimenticare di specificare lo dtype, altrimenti verrà impostato su dtype=object.

+0

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

+0

@TobiasKienzler, in realtà non mi piace molto 'lambdify' nel suo stato attuale. È una funzione complicata e imprevedibile che non ha nemmeno un ambito di applicazioni ben definito. A volte restituisce oggetti simbolici anche quando l'intero punto deve essere utilizzato per le valutazioni numeriche. – Krastanov

+0

Oh, questo è un peccato :-(Non l'ho usato così tanto finora, ma l'idea dietro sembra davvero grandiosa ... –