繁体   English   中英

评估值为False时表达式相等检查的Python- Sympy问题

[英]Python- Sympy Issue with expression equality check when evaluate=False

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

请考虑以下示例:

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

由于k2.args(x,y,2)k1.args(x,2,y)结果为false 因此,当比较检查元组是否相等时,它会返回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])将是相同的,这是我所不希望的。

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

以下内容对您有帮助吗?

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

找到了一种解决方法。

在表达式格式的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) 

arg_list.sort()相等检查时,我要进行一次额外的检查,首先将args列表排序为arg_list.sort()然后比较两个列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM