【问题标题】:sympy: 'Transpose' object has no attribute tolistsympy:“转置”对象没有属性 tolist
【发布时间】:2015-11-17 05:45:04
【问题描述】:

我正在尝试使用 sympy 进行一些符号矩阵计算。我的目标是获得一些矩阵计算结果的符号表示。我遇到了一些问题,我将其归结为这个简单的示例,在该示例中,我尝试评估对指定矩阵求幂并将其乘以任意向量的结果。

>>> import sympy
>>> v = sympy.MatrixSymbol('v', 2, 1)
>>> Z = sympy.zeros(2, 2)  # create 2x2 zero matrix
>>> I = sympy.exp(Z)  # exponentiate zero matrix to get identity matrix
>>> I * v
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sympy/matrices/matrices.py", line 507, in __mul__
    blst = B.T.tolist()
AttributeError: 'Transpose' object has no attribute 'tolist'

相比之下,如果我直接创建单位矩阵,然后乘以v,那就没有问题了:

>>> I_ = sympy.eye(2)  # directly create the identity matrix
>>> I_ == I  # check the two matrices are equal
True
>>> I_ * v
v

我注意到的一件事是这两个单位矩阵属于不同的类别:

>>> I.__class__
sympy.matrices.immutable.ImmutableMatrix
>>> I_.__class__
sympy.matrices.dense.MutableDenseMatrix

我还发现调用as_mutable() 方法提供了一种解决方法。

>>> I.as_mutable() * v
v

是否总是需要在一个人的线性代数计算中使用as_mutable() 调用?我猜不是,而是这些错误表明我使用错误的策略来解决我的问题,但我无法弄清楚正确的策略是什么。有没有人指点一下?

我已经阅读了Immutable Matrices 上的文档页面,但我仍然可以使用一些帮助来了解它们与标准可变矩阵的差异在这里的重要性,以及为什么某些操作(例如 sympy.exp)在这些不同的类之间转换。

【问题讨论】:

  • 仅供参考,该错误已在 sympy 的 master 分支中修复。

标签: python matrix sympy symbolic-math


【解决方案1】:

我声称这是 Sympy 中的一个错误:

在 Python 中,您可以overload the multiplication operator from both sidesA*B 可以通过调用A.__mul__(B)B.__rmul__(A) 在内部进行处理。 Python首先调用A.__mul__,如果这个方法不存在或者返回NotImplemented,那么Python会自动尝试B.__rmul__。 SymPy 使用名为 call_highest_priority 的装饰器来决定使用这两种实现中的哪一种。它查找所涉及类的_op_priority,并以更高的优先级调用实现的函数。在您的情况下,vI 的优先级为 11,I_ 的优先级为 10.01,因此首选 I。此外,I 使用的 __mul__ 的基本实现缺少装饰器。

长话短说,I*v 最终总是调用I.__mul__,而__mul__ 无法处理MatrixSymbols 但也不返回NotImplementedv.__rmul__(I) 按预期工作。

正确的解决方法是在matrices.py 中捕获AttributeError 并返回NotImplemented,即

try:
    blst = B.T.tolist()
except AttributeError:
    return NotImplemented

然后Python 会自动回退到__rmul__。 hack'ish 的解决方法是调整_op_priority。无论哪种方式,您都应该提交错误报告:如果错误是设计使然(也就是说,如果您不小心尝试了一些不应该工作的东西),那么错误消息会这样写。

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2020-12-03
    相关资源
    最近更新 更多