如何在SymPy中解析含数组的表达式并完成代入求值?
SymPy数组表达式处理方案
问题根因
- 下标访问报错是因为默认解析器会把
x识别为普通Symbol对象,原生不支持索引操作 sum(x)不计算是因为解析器默认调用SymPy惰性求值的Sum对象,subs仅做符号替换,不会自动触发求和计算
具体实现方案
1. 支持x[0]+x[1]类下标表达式
使用IndexedBase定义可索引的符号数组,提前注入到解析器的命名空间中:
from sympy import IndexedBase from sympy.parsing.sympy_parser import parse_expr # 提前声明x为可索引类型,注入解析命名空间 local_ns = {"x": IndexedBase("x")} expr = parse_expr("x[0] + x[1]", local_dict=local_ns) # 代入求值时生成索引-值的映射字典 x_val = [1, 2, 3] sub_map = {local_ns["x"][i]: x_val[i] for i in range(len(x_val))} res = expr.subs(sub_map) print(res) # 输出3
2. 支持sum(x)类求和表达式
解析时将sum绑定为Python原生求和函数,替换后会自动对传入的列表计算总和:
from sympy.parsing.sympy_parser import parse_expr # 注入sum为Python内置函数 local_ns = {"sum": sum} expr = parse_expr("sum(x)", local_dict=local_ns) res = expr.subs({"x": [1, 2, 3]}) print(res) # 输出6
补充说明
如果需要使用SymPy原生的符号求和能力,解析后得到的Sum对象调用.doit()方法即可触发计算。
内容的提问来源于stack exchange,提问作者Dax Fohl
相关产品推荐
相关产品推荐

