sympy 表达式的 numpy 数组中某些符号的数值计算

Pet*_*lia 4 python numpy sympy numerical-methods

问题

我正在使用任意 MxN numpy 矩阵,其中每个元素都是一个 sympy 表达式,可能具有不同的符号。出于可视化的目的,让我们使用以下矩阵test

import sympy as sp
import numpy as np

a,b,c=sp.symbols('a b c');
test=np.array([[a**2,a+b],[a*c+b,b/c]]);
Run Code Online (Sandbox Code Playgroud)

运行时,test将如下所示:

In [25]: test
Out[25]: 
array([[a**2, a + b],
       [a*c + b, b/c]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我希望能够用一个数字替换此数组中的一个变量,并返回一个新数组,该数组与具有相同维度test但已将指定变量替换为它的新值。例如,如果我想b用 2替换,新数组应如下所示:

array([[a**2, a + 2],
       [a*c + 2, 2/c]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

尝试解决方案

我首先尝试使用 sympy 函数,subs但收到以下错误:

test.subs({b:2})
Traceback (most recent call last):

  File "<ipython-input-29-a9a04d63af37>", line 1, in <module>
    test.subs({b:2})

AttributeError: 'numpy.ndarray' object has no attribute 'subs'
Run Code Online (Sandbox Code Playgroud)

我查看了使用 lamdify 但我相信它返回一个数字 lambda 表达式,这不是我想要的。我需要一个新的符号表达式,只是一个不再依赖的表达式b。我在模式匹配下的 Wolfram Mathematica 文档中找到了一些文献,这似乎是我需要的http://www.wolfram.com/language/fast-introduction-for-programmers/en/patterns/但我想不通如何在 Python 中实现这一点,或者是否有可能这样做。任何帮助将不胜感激。

hpa*_*ulj 5

只需使用sympy. 不需要numpy,至少不需要替换:

In [117]: import sympy
In [118]: a,b,c=sympy.symbols('a b c')

In [120]: M=sympy.Matrix([[a**2, a+b],[a*c+b, b/c]])
In [121]: M
Out[121]: 
Matrix([
[   a**2, a + b],
[a*c + b,   b/c]])

In [123]: M.subs({b:2})
Out[123]: 
Matrix([
[   a**2, a + 2],
[a*c + 2,   2/c]])
Run Code Online (Sandbox Code Playgroud)