【问题标题】:Python- Sympy Issue with expression equality check when evaluate=FalsePython-评估= False时表达式相等检查的Sympy问题
【发布时间】:2011-11-10 13:02:39
【问题描述】:

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

请考虑以下示例:

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

结果是false,因为k2.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]) 将是相同的,这是我不想要的。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

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

    【讨论】:

    • 我发布了这个问题,以便有人可以建议我以这种方式进行比较。是的,我的乘法总是可交换的。请在我的问题中查看已编辑的部分
    【解决方案2】:

    以下内容对您有帮助吗?

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

    【讨论】:

    • 实际上并非如此。在这种情况下,“x+2y”和“x+y+y”是相同的。我不希望 sympy 执行任何操作。虽然我找到了一种解决方法。我首先将所有参数展平,而不是对其进行排序和比较。
    【解决方案3】:

    找到一种解决方法。

    在 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() 然后比较两个列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多