将SymPy矩阵转换为numpy数组/矩阵的最佳方法是什么?

Sau*_*tro 15 python arrays numpy matrix sympy

我不确定我用过的方法是sympy将a转换MutableDenseMatrix为a numpy.array还是numpy.matrix当前的好习惯.

我有一个符号矩阵,如:

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]] )
Run Code Online (Sandbox Code Playgroud)

我正在转变为numpy.array:

g_func = lambda val: numpy.array( g.subs( {x:val} ).tolist(), dtype=float )
Run Code Online (Sandbox Code Playgroud)

我得到一个给定值的数组x.

SymPy中有更好的内置解决方案吗?

谢谢!

Tur*_*ute 20

这看起来最简单:

np.array(g).astype(np.float64)
Run Code Online (Sandbox Code Playgroud)

如果跳过astype方法,numpy将创建一个'object'类型的矩阵,这对于常见的数组操作不起作用.

  • 有用。而np.array(g,dtype = np.float64)不会。 (2认同)

Sau*_*tro 11

我在这里接受克拉斯坦诺夫和asmeurer的建议.这个小片断使用lambdify从sympy:

from sympy import lambdify
g_func = lambdify( (x), g )
Run Code Online (Sandbox Code Playgroud)

这似乎是实现问题要求的最佳方式.


Hen*_*nry 7

SymPy-0.7.6.1_mpmath_ 矩阵文档中,该tolist()方法存在:

最后,可以将矩阵转换为嵌套列表。这非常有用,因为大多数涉及矩阵或数组的 Python 库(即 NumPy 或 SymPy)都支持这种格式:

B.tolist()
Run Code Online (Sandbox Code Playgroud)


小智 6

Sympy 现在提供以下sympy.matrix2numpy功能:

sympy.matrix2numpy(g)
# array([[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]],
#      dtype=object)
Run Code Online (Sandbox Code Playgroud)

要对 的特定值执行替换x

g_func = lambda val: sympy.matrix2numpy(g.subs(x, val), dtype=float)
g_func(1)
# array([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
#        [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])
Run Code Online (Sandbox Code Playgroud)

这种方法对于将数值 Sympy 矩阵转换为 numpy 数组特别有用:

M = sympy.Matrix([[123,456],[789, 123]])
sympy.matrix2numpy(M, dtype=int)
# array([[123, 456],
#       [789, 123]])
Run Code Online (Sandbox Code Playgroud)


D A*_*ams 5

 numpy.array(SympyMatrix.tolist()).astype(numpy.float64)
Run Code Online (Sandbox Code Playgroud)

tolist使sympy矩阵成为嵌套索引的本机方法

numpy.array 可以将嵌套索引的内容转换为数组

.astype(float64) 将数组的数字转换为默认的numpy float类型,这将适用于任意numpy矩阵操作函数.

作为一个额外的注意事项 - 值得一提的是,通过投射到numpy,你可以放松执行矩阵运算的能力,同时保持同步变量和表达式.

编辑:我的附加注释的一点是,在转换为numpy.array时,你失去了在矩阵中的任何位置都有变量的能力.你所有的矩阵元素必须在你演员之前已经是数字或者一切都会破裂.