29

我不确定我一直使用的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]] )

我正在转换为numpy.array

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

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

SymPy 中是否有更好的内置解决方案来做到这一点?

谢谢!

4

4 回答 4

37

这看起来是最直接的:

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

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

于 2016-05-27T20:38:26.900 回答
14

该答案基于 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]])
于 2013-06-19T15:38:15.327 回答
8
 numpy.array(SympyMatrix.tolist()).astype(numpy.float64)

tolist将sympy 矩阵变成嵌套索引的本机方法

numpy.array可以将嵌套索引的东西转换成数组

.astype(float64)将数组的数字转换为默认的 numpy 浮点类型,这将与任意 numpy 矩阵操作函数一起使用。

作为附加说明 - 值得一提的是,通过强制转换为 numpy,您将失去执行矩阵运算的能力,同时保留 sympy 变量和表达式以备不时之需。

编辑:我的附加说明是,在转换为 numpy.array 时,您失去了在矩阵中的任何位置拥有变量的能力。你所有的矩阵元素必须在你施放之前已经是数字,否则一切都会中断。

于 2015-11-13T21:33:52.057 回答
5

SymPy-0.7.6.1_mpmath_ matrix docs,该tolist()方法存在:

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

B.tolist()
于 2015-07-20T05:25:45.183 回答