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!
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]])
所有评论(0)