gpt4 book ai didi

python - sympy: 'Transpose' 对象没有属性 tolist

转载 作者:太空狗 更新时间:2023-10-29 21:07:04 31 4
gpt4 key购买 nike

我正在尝试使用 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 中的错误:

在 Python 中,你可以 overload the multiplication operator from both sides . A*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 是首选。此外, 使用的 __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__。骇人听闻的解决方法是调整 _op_priority。无论哪种方式,您都应该提交错误报告:如果错误是设计使然(也就是说,如果您不小心尝试了一些不应该工作的东西),那么错误消息会这样说。

关于python - sympy: 'Transpose' 对象没有属性 tolist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32171509/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com