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