SymPy - 将数字视为符号

SymPy - Treating numbers as symbols

如何在 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)

用唯一的符号替换每个常量。 分解结果表达式。 用常量替换唯一符号。

对于你给定的案例,是这样的:

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)

这应该会为您提供所需的输出。您可以使用简单的正则表达式或简单的解析器识别表达式中的数字标记——其中任何一个在许多其他位置都有介绍。

拯救符号的诡计:用数字命名的符号替换你的数字。在您的情况下,您不必注意负面版本,因此以下内容很简单:

>>> 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