【问题标题】:How to integrate Sympy and Numpy in python? Numpy array of sympy symbols如何在 python 中集成 Sympy 和 Numpy? sympy 符号的 Numpy 数组
【发布时间】:2019-11-10 10:34:02
【问题描述】:

假设我想要一个像 [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”的命令。

请有人指导我到正确的路径。

【问题讨论】:

  • Numpy 数组不能很好地与 sympy 对象配合使用(如果您使用带有 numpy 的内置数字类型,它们是最好的)。您应该尝试使用 sympy 数组,它支持 .subs 之类的东西。
  • 查看最近也使用lambdifysympy 帖子。但小心点。有许多陷阱。检查a 数组的dtype。对象 dtype 数组上的数学是命中或未命中。 sympynumpy 不像在 MATLAB 上那样紧密集成。 stackoverflow.com/questions/58772201/…
  • 稀疏矩阵模块可能有用。

标签: python numpy sympy


【解决方案1】:

正如 hpaulj 在 cmets 中所解释的,SymPy 和 NumPy 生活在不同的世界中。 如果您需要快速处理数字,NumPy 是您的英雄。 SymPy 在符号操作方面大放异彩。 要从 SymPy 过渡到 NumPy,您可以在 SymPy 中将所有内容转换为数字,然后再将其转换为 NumPy。或者您使用 lambdify 将 SymPy 表达式转换为 NumPy 函数。

参见例如this post SymPy 如何计算非常复杂的表达式的导数,然后将其转换为 NumPy 函数。

如果你真的想要速度,Numba 之类的库可以将 NumPy 函数转换为机器码(无需外部编译步骤)。

这些库本身非常强大,但缺乏流畅的互操作性,一开始可能会让人困惑。

如果您让 SymPy 对列表的每个元素进行操作,而不是对整个列表进行操作,您的示例就可以工作。 SymPy 的subs 填充变量。 SymPy 的 evalf 将常量表达式转换为数字(因为通常 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)

【讨论】:

    【解决方案2】:
    In [41]: from sympy import Matrix                                               
    
    In [42]: m = Matrix([x, 2*x])                                                   
    
    In [43]: m.subs(x,23)                                                           
    Out[43]: 
    ⎡23⎤
    ⎢  ⎥
    ⎣46⎦
    

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2012-04-25
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多