我正在使用任意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)
我希望能够用数字替换此数组中的一个变量,并返回一个与test
具有相同尺寸的新数组,但已将其指定的变量替换为新值。例如,如果我想将b
替换为2,则新数组应如下所示:
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,但我相信它会返回一个数字lambda表达式,这不是我想要的。我需要一个新的符号表达式,只需要一个不再依赖b
的表达式。我在Wolfram Mathematica文档中找到了一些模式匹配下的文献,这似乎是我需要的http://www.wolfram.com/language/fast-introduction-for-programmers/en/patterns/,但我无法弄清楚如何在Python中实现它,或者甚至可能这样做。任何帮助将不胜感激。
答案 0 :(得分:3)
只需使用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]])
答案 1 :(得分:1)
数组不是表达式,因此它没有方法subs