2013-06-12 23 views
8

Non sono sicuro se l'approccio che ho usato in sympy per convertire un MutableDenseMatrix ad un numpy.array o numpy.matrix è una buona pratica corrente.Qual è il modo migliore per convertire una matrice SymPy ad un NumPy matrice/matrice

Ho una matrice simbolica come:

g = sympy.Matrix([[ x, 2*x, 3*x, 4*x, 5*x, 6*x, 7*x, 8*x, 9*x, 10*x] 
        [x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]]) 

e sto convertendo ad un numpy.array fare:

g_func = lambda val: numpy.array(g.subs({x:val}).tolist(), dtype=float) 

dove ottengo un array per un dato valore di x.

C'è una soluzione integrata migliore in SymPy per farlo?

Grazie!

+1

La maggior parte di questa domanda viene fornita qui http: // stackoverflow.it/questions/10678843/evaluate-sympy-expression-from-an-array-of-values ​​/ 10683911 # 10683911 - So che non è esattamente la stessa domanda ma fornisce tutto ciò che è necessario sapere sull'interoperabilità numpy/sympy. – Krastanov

+0

grazie! sentirsi a pagamento per preparare una risposta, perché penso che questo sia l'approccio migliore anche per il mio caso ... –

+1

Sì, usa 'lambdify' (sono troppo pigro per scriverlo a una risposta in questo momento). – asmeurer

risposta

9

Sto rispondendo qui prendendo i consigli di Krastanov e asmeurer. Questo piccolo frammento utilizza lambdify da sympy:

from sympy import lambdify 
g_func = lambdify((x), g) 

questo sembra essere il modo migliore per ottenere ciò che la questione sta chiedendo.

1

Dal SymPy-0.7.6.1_mpmath_ matrix docs, il metodo tolist() esiste:

Infine, è possibile convertire una matrice ad una lista annidata. Ciò è molto utile, come la maggior parte librerie Python coinvolgono matrici o array (cioè NumPy o SymPy) supportano questo formato:

B.tolist() 
+0

'mpmath.matrices.matrices.tolist()' restituisce una lista di 'mpmath.ctx_mp_python.mpf' quindi dovrai ancora lanciarlo, ma IMO questo non è quello che l'OP sta chiedendo, dal momento che vogliono una funzione questo produce array numpy, che è la risposta accettata. –

3
numpy.array(SympyMatrix.tolist()).astype(numpy.float64) 

Il tolist metodo nativo rende la matrice sympy in qualcosa nestedly indicizzati

numpy.array può lanciare qualcosa nestedly indicizzato in array

.astype(float64) proietterà numeri della matrice in difetto numpy a galleggiante, che w funziona male con le funzioni arbitrarie di manipolazione della matrice numpy.

Come nota aggiuntiva, vale la pena ricordare che lanciando numpy si perde la capacità di eseguire operazioni matrix mantenendo le variabili e le espressioni sympy lungo la corsa.

MODIFICA: Il punto della mia nota aggiuntiva, è che al momento del lancio su numpy.array, si perde la possibilità di avere una variabile in qualsiasi punto della matrice. Tutti i tuoi elementi di matrice devono essere numeri già prima di lanciare o tutto si spezzerà.

+4

Sebbene questa risposta sia probabilmente corretta e utile, è preferibile che tu [includa alcune spiegazioni insieme a questa] (http://meta.stackexchange.com/q/114762/159034) per spiegare come aiuta a risolvere il problema. Ciò diventa particolarmente utile in futuro, se c'è un cambiamento (possibilmente non correlato) che lo fa smettere di funzionare e gli utenti devono capire come funzionava una volta. –

7

Questo appare come la più semplice:

np.array(g).astype(np.float64) 

Se si salta il metodo astype, NumPy creerà una matrice di tipo 'oggetto', che non funziona con le operazioni di matrice comune.

+0

Buona comprensione, grazie –

Problemi correlati