I am not sure if the approach I've been using in sympy
to convert a MutableDenseMatrix
to a numpy.array
or numpy.matrix
is a good current practice.
I have a symbolic matrix like:
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]] )
and I am converting to a numpy.array
doing:
g_func = lambda val: numpy.array( g.subs( {x:val} ).tolist(), dtype=float )
where I get an array for a given value of x
.
Is there a better built-in solution in SymPy to do that?
Thank you!
In general, SymPy functions do not work with objects from other libraries, such as NumPy arrays, and functions from numeric libraries like NumPy or mpmath do not work on SymPy expressions.
Numpy matrices are strictly 2-dimensional, while numpy arrays (ndarrays) are N-dimensional. Matrix objects are a subclass of ndarray, so they inherit all the attributes and methods of ndarrays.
We can create a matrix in Numpy using functions like array(), ndarray() or matrix(). Matrix function by default creates a specialized 2D array from the given input. The input should be in the form of a string or an array object-like.
This looks like the most straightforward:
np.array(g).astype(np.float64)
If you skip the astype method, numpy will create a matrix of type 'object', which won't work with common array operations.
This answer is based on the advices from Krastanov and asmeurer. This little snippet uses sympy.lambdify:
from sympy import lambdify from sympy.abc import x, y g = sympy.Matrix([[ x, 2*x, 3*x, 4*x, 5*x, 6*x, 7*x, 8*x, 9*x, 10*x], [y**2, y**3, y**4, y**5, y**6, y**7, y**8, y**9, y**10, y**11]]) s = (x, y) g_func = lambdify(s, g, modules='numpy')
where g
is your expression containing all symbols grouped in s
.
If modules='numpy'
is used the output of function g_func
will be a np.ndarray
object:
g_func(2, 3) #array([[ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], # [ 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147]]) g_func(2, y) #array([[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], # [y**2, y**3, y**4, y**5, y**6, y**7, y**8, y**9, y**10, y**11]], dtype=object)
If modules='sympy'
the output is a sympy.Matrix
object.
g_func = lambdify(vars, g, modules='sympy') g_func(2, 3) #Matrix([[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], # [9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147]]) g_func(2, y) #Matrix([[ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], # [y**2, y**3, y**4, y**5, y**6, y**7, y**8, y**9, y**10, y**11]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With