Python- Sympy在evaluate = False时使用表达式相等性检查的问题

时间:2011-11-10 13:02:39

标签: python sympy

在我的项目中,我必须在创建任何evaluate=falseAdd对象时使用Mul。在这种情况下,当我对这些对象应用相等性检查时,我遇到了问题。问题是由于参数的排序。

请考虑以下示例:

k2=Mul(*[x,y,2],evaluate=False)
k1=Mul(*[x,2,y],evaluate=False)
print k1==k2 

结果为falsek2.args(x,y,2)k1.args(x,2,y)。 因此,当比较检查元组相等时,它返回false。 有什么方法可以得到想要的结果吗?

另外,如果我对元组进行一些操作(比如反转顺序然后检查),那么当k1k2由不同的Mul个对象组成时,它会失败(比如k1.args = 2*x,yk2.args = 2*y,x

我不能在这里使用排序,因为在这种情况下Add([x+y,z],evaluate=False)Add([x+z,y],evaluate=False)将是两个不同的表达式。此外,如果我使用evalaute=True,在这种情况下,Add([x+y],x])Add([2*x+y])将是相同的,我不想要。

3 个答案:

答案 0 :(得分:1)

Mul并不知道x和y都代表了标量。矩阵乘法取决于参数的顺序,因此在您的示例中,k1和k2不一定相等。 如果你知道在你的程序中x和y将始终是标量(或其他类型的值,其中乘法是可交换和关联的),可能有一种方法可以从每个项中分解出常量,比较常量并比较排序列表条款。

答案 1 :(得分:0)

以下内容对您有帮助吗?

print simplify(k1 - k2) == 0 # True
print k1 == k2 # Still False

答案 2 :(得分:0)

找到一个解决方法。

在表达形式的Add / Mul类中 使用下面的代码展平所有参数

   flatten_args = []
            for arg in args:
                if (arg.__class__==cls):
                    flatten_args.extend(arg.args)
                else:
                    flatten_args.append(arg)

            obj = Expr.__new__(cls, *flatten_args) 

在平等检查时,我正在进行一次额外检查 首先对args列表进行排序arg_list.sort(),然后比较两个列表