未持有原符号时替换Sympy矩阵中变量的可行方法
Sympy矩阵丢失原符号引用时的subs替换方案
问题复现
当构造sympy.Matrix使用的原始符号变量被后续代码重赋值覆盖后,会因为拿不到原符号对象导致subs()替换失效,复现代码如下:
import sympy as sp x = sp.Symbol('x', real=True) m = sp.Matrix([[0, x], [0, 0]]) x = 'something_else' print(m.subs(x, 10))
上述代码执行时会因为x已经被赋值为字符串,无法完成预期的符号替换。
无需重建同名符号的实现方法
不需要手动重新创建同名标签的符号,可以直接从Matrix对象本身提取存储在内部的原符号对象:
- 方法1:通过
free_symbols属性提取所有符号
Matrix对象自带free_symbols属性,会返回矩阵表达式包含的所有自由符号的集合,拿到集合后按符号名筛选即可得到原符号对象,不需要依赖外部的变量引用。
示例代码:# 从矩阵中筛选名为x的原符号对象 target_sym = next(sym for sym in m.free_symbols if sym.name == 'x') print(m.subs(target_sym, 10)) # 输出:Matrix([[0, 10], [0, 0]]) - 方法2:直接提取矩阵对应位置的符号
如果明确知道目标符号所在的矩阵位置,可以直接取对应位置的元素,该元素就是构造时传入的原符号对象,可直接用于subs替换。
示例代码:# 示例中x在矩阵第0行第1列的位置 target_sym = m[0, 1] print(m.subs(target_sym, 10))
注意:不推荐手动重新创建同名符号的方式,如果原符号设置了
real=True、positive=True这类假设属性,新建的同名符号如果属性不匹配,会被Sympy判定为完全不同的对象,最终导致替换失败。
内容的提问来源于stack exchange,提问作者Pickniclas
相关产品推荐
相关产品推荐

