如何避免Sympy输出表达式时负项前置?
解决SymPy表达式负项前置问题
SymPy默认会按自身内部规则(如变量字母顺序、项的次数等)排列表达式项,不会自动以正项优先。要让表达式正项在前、负项在后,可通过手动调整加法项的顺序实现:
方法:自定义函数调整项顺序
编写一个简单函数,分离表达式中的正项和负项,重新组合成正项在前的形式,再批量应用到数组的每个元素上:
from sympy import symbols, Matrix, Add import numpy as np m = 3 obj = np.dtype(object) ρ = np.asarray([symbols(f"ρ_{i}") for i in range(m)], obj) ε = np.asarray([symbols(f"ε_{i}") for i in range(m)], obj) # 定义调整项顺序的函数 def positive_first(expr): if isinstance(expr, Add): # 拆分正项和负项 positive_terms = [] negative_terms = [] for term in expr.args: coeff = term.as_coeff_Mul()[0] if coeff.is_positive: positive_terms.append(term) else: negative_terms.append(term) # 正项在前,负项在后重新组合 return Add(*positive_terms, *negative_terms) return expr # 生成表达式并调整顺序 expr = ε - ρ * ε[1] # 用vectorize批量处理数组中的每个表达式 adjusted_expr = np.vectorize(positive_first)(expr) Matrix(adjusted_expr)
说明
- 函数
positive_first会检查表达式是否为加法类型(Add),若是则拆分正、负项,再按正项在前的顺序重新组合。 - 使用
np.vectorize可方便地将函数应用到NumPy数组的每个元素上,无需手动遍历。 - 该方法为局部调整,不会影响SymPy全局排序规则,适合仅需特定格式输出的场景。
内容的提问来源于stack exchange,提问作者Erdem Şen
相关产品推荐
相关产品推荐

