[英]Python- Sympy Issue with expression equality check when evaluate=False
在我的项目中,创建任何Add
或Mul
对象时,我必须使用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
。 有什么办法可以得到想要的结果吗?
另外,如果我对元组进行一些操作(例如反转顺序然后检查),则在k1
和k2
由不同的Mul
对象组成的情况下(例如,当k1.args
= 2*x,y
和k2.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.