【问题标题】:How to add a generator to a Sympy Poly object?如何将生成器添加到 Sympy Poly 对象?
【发布时间】:2020-01-19 23:42:42
【问题描述】:

我正在为我的 sympy 代码编写一些测试,自然我需要比较两个 sympy 矩阵。每个矩阵都包含Poly 类型的对象作为其条目(实际上,它包含我创建的扩展Poly 类的类的对象,但这不应该有所作为)。

问题在于,当我尝试在测试中比较这些对象时,即使表达式相同,生成器也不同,即使它们相同,也会产生失败的测试。

例如:

from sympy.matrices import Matrix 

expected_matrix = Matrix([[Poly(1.0*y1 + 2.0*x2 + 1.0*x1, y1, x2, x1, domain='RR')]])

actual_matrix = Matrix([[Poly(1.0*y1 + 1.0*x2, y2, y1, x2, x1, domain='RR') + Poly(1.0*x2 + 1.0*x1, y2, y1, x2, x1, domain='RR')]])

# however, when these get compared, they don't agree because notice that the `y2` generator does not appear in the `expected_matrix`.

我的问题是如何使生成器相等。如何将生成器添加到实际输出中?或者,让生成器远离预期输出?

由于gens 属性是一个元组,所以这很困难,因为我不能只向gens 属性添加一个元素:

actual_matrix.gens = expected_matrix.gens

也许我可以单独比较表达式,但这对我来说似乎很冒险(除非有更多经验的人可以说服我不这样做)。

如何比较这两件事?

【问题讨论】:

    标签: python python-3.x oop sympy python-object


    【解决方案1】:

    如果您将矩阵中的多边形转换为表达式,它将起作用。

    >>> expected_matrix.applyfunc(lambda x:x.as_expr())==actual_matrix.applyfunc(lambda x:x.as_expr())
    True
    

    【讨论】:

    • 对,所以您似乎在比较表达式(这是我在问题末尾提到的)。这似乎有风险,因为通常可能有两个相同的表达式,但它们可能具有不同的域或不同的符号。还有其他方法吗?
    • 如果您希望具有相同符号但不同域的 Polys 进行不同的比较,那么您将不得不制定自己的比较例程,因为 Poly(x, domain=RR)==Poly(x,domain=ZZ) -> True。如果是这样,您可以将每个矩阵的元素列表与list(map(lambda x: (x.as_expr(), x.domain), Matrix([Poly(x,domain=ZZ)]))) 进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2023-01-19
    相关资源
    最近更新 更多