如何在python中集成Sympy和Numpy?符号的Numpy数组
假设我想要一个像这样的数组向量[x,2x],然后我想在x=5时计算这个数组。结果变成了[5,10] 这可以在matlab中使用符号工具箱轻松完成。然而,我刚从matlab转到python,有人建议我使用Numpy和Sympy来取代matlab强大的矩阵操作 我尝试了以下代码如何在python中集成Sympy和Numpy?符号的Numpy数组,python,numpy,sympy,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]) 然而,当x是任意数字时,我找不到任何可以用来计算“a”的命令 有
import numpy as np
import sympy as sp
x=sp.symbols('x')
a=np.array([x , 2*x])
然而,当x是任意数字时,我找不到任何可以用来计算“a”的命令
有人能告诉我正确的路径吗。正如hpaulj在评论中解释的那样,SymPy和NumPy生活在不同的世界里。 如果你需要快速运算,NumPy是你的英雄。 SymPy在象征性的操纵中大放异彩。 要从SymPy切换到NumPy,您可以先将SymPy中的所有内容转换为数字,然后再将其切换到NumPy。或者使用
lambdify
,将SymPy表达式转换为NumPy函数
例如,请参见Symphy如何计算非常复杂表达式的导数,然后将其转换为NumPy函数
如果您真的想要速度,那么库(如)可以将NumPy函数转换为机器代码(无需外部编译步骤)
这些库本身非常强大,但缺乏流畅的互操作性,这在一开始可能会令人困惑
如果让Symphy对列表中的每个元素进行操作,而不是对整个列表进行操作,那么您的示例就会起作用。Symphy的subs
填充变量。SymPy的evalf
将常量表达式转换为数字(因为SymPy通常以符号形式保留有理数和sqrt,因此它保持最大精度)
将sympy作为sp导入
将numpy作为np导入
x=sp.symbols('x')
b=[x,2*x]
c=[expr.subs(x,5).evalf()表示b中的expr]
a=np.数组(c)
正如hpaulj在评论中解释的那样,SymPy和NumPy生活在不同的世界里。
如果你需要快速运算,NumPy是你的英雄。
SymPy在象征性的操纵中大放异彩。
要从SymPy切换到NumPy,您可以先将SymPy中的所有内容转换为数字,然后再将其切换到NumPy。或者使用lambdify
,将SymPy表达式转换为NumPy函数
例如,请参见Symphy如何计算非常复杂表达式的导数,然后将其转换为NumPy函数
如果您真的想要速度,那么库(如)可以将NumPy函数转换为机器代码(无需外部编译步骤)
这些库本身非常强大,但缺乏流畅的互操作性,这在一开始可能会令人困惑
如果让Symphy对列表中的每个元素进行操作,而不是对整个列表进行操作,那么您的示例就会起作用。Symphy的subs
填充变量。SymPy的evalf
将常量表达式转换为数字(因为SymPy通常以符号形式保留有理数和sqrt,因此它保持最大精度)
将sympy作为sp导入
将numpy作为np导入
x=sp.symbols('x')
b=[x,2*x]
c=[expr.subs(x,5).evalf()表示b中的expr]
a=np.数组(c)
Numpy数组不能很好地处理sympy对象(如果在Numpy中使用内置的数字类型,它们是最好的)。您应该改为尝试Symphy数组,它将支持类似于.subs
的内容。看看最近的Symphy
文章,它们也使用lambdify
。但是要小心。有许多陷阱。检查a
数组的dtype
。对象数据类型数组上的数学是命中还是未命中sympy
和numpy
的集成度不如MATLAB。稀疏矩阵模块可能很有用。Numpy数组不能很好地处理sympy对象(如果在Numpy中使用内置的数值类型,它们是最好的)。您应该改为尝试Symphy数组,它将支持类似于.subs
的内容。看看最近的Symphy
文章,它们也使用lambdify
。但是要小心。有许多陷阱。检查a
数组的dtype
。对象数据类型数组上的数学是命中还是未命中sympy
和numpy
的集成度不如MATLAB。稀疏矩阵模块可能很有用。
In [41]: from sympy import Matrix
In [42]: m = Matrix([x, 2*x])
In [43]: m.subs(x,23)
Out[43]:
⎡23⎤
⎢ ⎥
⎣46⎦