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

Numeric computation of certain symbols in numpy array of sympy expressions

问题

我正在使用任意 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]]);

当 运行 时,test 看起来像:

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

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

array([[a**2, a + 2],
       [a*c + 2, 2/c]], dtype=object)

尝试解决方案

我首先尝试使用 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'

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

array 不是表达式,因此它没有方法 subs

只需使用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]])