2012-04-12 23 views
7

Tengo el siguiente código: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 

Mi pregunta está relacionada con el código anterior, me gustaría definir un modelo utilizando sympy si es posible, después en la función de actualización reemplazar el sympy variables con los valores x ¿Es posible? ¿Cómo puedo hacer eso?

Respuesta

12

Puedo proponerle dos soluciones.

En primer lugar, hay DeferedVector que fue creado para su uso 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]] 

Sin embargo lambdify hace demasiada magia para mi gusto.

Otra opción es utilizar el método de .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⎦ 

Puede crear el diccionario para la sustitución de esa manera:

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

No olvide que todos los objetos de retorno son matrices sympy. Para convertirlos a matrices numpy simplemente use np.array(the_matrix_in_question) y no olvide especificar el dtype, de lo contrario, estará predeterminado en dtype=object.

+0

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

+0

@TobiasKienzler, en realidad no me gusta 'lambdify' en su estado actual. Es una función intrincada e impredecible que ni siquiera tiene un alcance bien definido de aplicaciones. Algunas veces, incluso devuelve objetos simbólicos cuando el punto completo debía usarse para evaluaciones numéricas. – Krastanov

+0

Oh, eso es desafortunado :-(No lo he usado mucho hasta ahora, pero la idea detrás de esto suena realmente genial ... –