如何在python中集成Sympy和Numpy?符号的Numpy数组

如何在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”的命令 有

假设我想要一个像这样的数组向量[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”的命令


有人能告诉我正确的路径吗。

正如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⎦