如何在SymPy中将数字视为符号?
例如,如果我使用符号执行因子分解,则会得到:
from sympy import factor
factor('a*c*d + a*c*e + a*c*f + b*c*d + b*c*e + b*c*f')
c*(a + b)*(d + e + f)
当我在表达式中使用数字时,我想要相同的行为。 代替
from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
4013*c*(d + e + f)
我想得到
from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
c*(2006 + 2007)*(d + e + f)
答案 0 :(得分:1)
用一个唯一的符号替换每个常数。 分解结果表达式。 用常量替换唯一的符号。
对于您的给定情况,如下所示:
simple = factor('const2006*c*d + const2006*c*e + const2006*c*f + const2007*c*d + const2007*c*e + const2007*c*f')
simple.replace("const", '')
print(simple)
这应该为您提供所需的输出。您可以使用简单的正则表达式或琐碎的解析器来识别表达式中的数字标记,这两种标记都可以在许多其他位置使用。
答案 1 :(得分:0)
拯救符号的诡计:用数字给定名称的符号替换您的数字。就您而言,您不必监视否定版本,因此以下内容很简单:
>>> s = '2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f'
>>> eq = S(s, evaluate=False); eq
2006*c*d + 2007*c*d + 2006*c*e + 2007*c*e + 2006*c*f + 2007*c*f
>>> reps = dict([(i,Symbol(str(i))) for i in _.atoms(Integer)]); reps
{2006: 2006, 2007: 2007}
>>> factor(eq.subs(reps))
c*(2006 + 2007)*(d + e + f)
请注意:evaluate=False
用于防止相似项组合在一起以得到4013*c*d + 4013*c*e + 4013*c*f
。