[英]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.