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

oyt4ldly  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(186)

我不确定我在sympy中使用的将MutableDenseMatrix转换为numpy.arraynumpy.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]] )

我把它转换成numpy.array

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

在这里我得到一个给定值x的数组。
SymPy中是否有更好的内置解决方案来做到这一点?
谢谢你,谢谢!

s1ag04yj

s1ag04yj1#

这看起来是最简单的:

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

如果你跳过astype方法,numpy将创建一个类型为“object”的矩阵,这将不适用于常见的数组操作。

ryevplcw

ryevplcw2#

这个答案是基于Krastanov和asmeurer的建议。这个小片段使用了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')

其中g是包含所有分组在s中的符号的表达式。
如果使用modules='numpy',函数g_func的输出将是一个np.ndarray对象:

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)

如果modules='sympy',则输出为sympy.Matrix对象。

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]])
w9apscun

w9apscun3#

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

原生的tolist方法将sympy矩阵转换为嵌套索引
numpy.array可以将嵌套索引的内容转换为数组
.astype(float64)将数组的数字转换为默认的numpy float类型,这将与任意numpy矩阵操作函数一起工作。
作为一个额外的注意-值得一提的是,通过铸造numpy你松散的能力,做矩阵运算,同时保持sympy变量和表达式沿着的旅程。
编辑:我的附加说明的重点是,在转换为numpy.array时,您失去了在矩阵中任何地方拥有变量的能力。所有的矩阵元素必须是数字之前,你投或一切都将打破。

5cnsuln7

5cnsuln74#

从SymPy-0.7.6.1_mpmath_ matrix文档中,tolist()方法存在:
最后,可以将矩阵转换为嵌套列表。这非常有用,因为大多数涉及矩阵或数组(即NumPy或SymPy)的Python库都支持这种格式:

B.tolist()
6gpjuf90

6gpjuf905#

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)

要对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.]])

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

M = sympy.Matrix([[123,456],[789, 123]])
sympy.matrix2numpy(M, dtype=int)
# array([[123, 456],
#       [789, 123]])

相关问题