可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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!
回答1:
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.
回答2:
I am answering here taking the advices from Krastanov and asmeurer. This little snippet uses lambdify from sympy:
from sympy import lambdify g_func = lambdify( (x), g )
This seems to be the best way to achieve what the question is asking for.
回答3:
numpy.array(SympyMatrix.tolist()).astype(numpy.float64)
The native tolist
method to makes the sympy matrix into something nestedly indexed
numpy.array
can cast something nestedly indexed into arrays
.astype(float64)
will cast numbers of the array into the default numpy float type, which will work with arbitrary numpy matrix manipulation functions.
As an additional note - it is worth mentioning that by casting to numpy you loose the ability to do matrix operations while keeping sympy variables and expressions along for the ride.
EDIT: The point of my additional note, is that upon casting to numpy.array, you loose the ability to have a variable anywhere in your matrix. All your matrix elements must be numbers already before you cast or everything will break.
回答4:
From the SymPy-0.7.6.1_mpmath_ matrix docs, the tolist()
method exists:
Finally, it is possible to convert a matrix to a nested list. This is very useful, as most Python libraries involving matrices or arrays (namely NumPy or SymPy) support this format:
B.tolist()