For*_*an1 1 python numpy sympy
假设我想要一个像 [x , 2x] 这样的数组向量,然后我想在 x=5 时计算这个数组。所以结果就变成了[5, 10]。
这可以在 matlab 中使用符号工具箱轻松完成。然而,我刚刚从 matlab 转向 python,建议我使用 Numpy 和 Sympy 来替代 Matlab 强大的矩阵操作。
我尝试了以下代码
import numpy as np
import sympy as sp
x=sp.symbols('x')
a=np.array([x , 2*x])
Run Code Online (Sandbox Code Playgroud)
但是,当 x 是任意数字时,我找不到任何可用于计算“a”的命令。
有人可以引导我走正确的道路吗?
正如 hpaulj 在评论中所解释的那样,SymPy 和 NumPy 生活在不同的世界中。如果您需要快速的数字运算,NumPy 就是您的英雄。SymPy 在符号操作方面表现出色。要从 SymPy 过渡到 NumPy,您可以在将 SymPy 中的所有内容转换为 NumPy 之前将其转换为数字。或者您使用lambdify它将 SymPy 表达式转换为 NumPy 函数。
例如,请参阅这篇文章SymPy 如何计算非常复杂表达式的导数,然后将其转换为 NumPy 函数。
如果您确实想要速度, Numba等库可以将 NumPy 函数转换为机器代码(无需外部编译步骤)。
这些库本身非常强大,但缺乏流畅的互操作性,这在一开始可能会令人困惑。
如果您让 SymPy 对列表的每个元素而不是整个列表进行操作,则您的示例将有效。SymPysubs填充变量。SymPyevalf将常量表达式转换为数字(因为通常 SymPy 将有理数和 sqrt 等保持为符号形式,因此它保持最大精度)。
import sympy as sp
import numpy as np
x = sp.symbols('x')
b = [x , 2*x]
c = [expr.subs(x, 5).evalf() for expr in b]
a = np.array(c)
Run Code Online (Sandbox Code Playgroud)