【发布时间】:2018-11-26 20:30:44
【问题描述】:
我正在尝试在 python 上实现一些算法。为了文档和对流程细节的清晰理解,我使用 sympy。事实证明,它在计算倒置浮点矩阵时失败了。
所以我明白了
TypeError Traceback (most recent call last)
<ipython-input-20-c2193b2ae217> in <module>()
10 np.linalg.inv(xx)
11 symInv = lambdify(X0,X0Inv)
---> 12 symInv(xx)
/opt/anaconda3/lib/python3.6/site-packages/numpy/__init__.py in <lambda>(X0)
TypeError: ufunc 'bitwise_xor' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
如果矩阵是整数,它可以正常工作:
import numpy as np
from sympy import *
init_printing()
X0 = MatrixSymbol('X0',2,2)
xx = np.random.rand(4,4)
#xx = np.random.randint(10,size=(4,4)) # this line makes it workable
X0Inv = X0**-1
np.linalg.inv(xx)
symInv = lambdify(X0,X0Inv)
symInv(xx)
Link to a live version of the code
如果有人知道任何解决方法,如果您能分享,那就太好了。提前致谢。
更新。正如@hpaulj 和@tel 所指出的,问题是lambdify 如何将** 转换为矩阵符号的numpy 代码:由于某种原因,它试图对元素进行异或。我将尝试找到一种简单的方法来改变这种行为。任何帮助/提示表示赞赏。
【问题讨论】:
-
每当您报告 Python 错误时,请在问题中包含 complete 错误消息(即完整的回溯)。里面有有用的信息。
-
所以问题出在
symInv(xx)行。您是否有任何证据(来自文档)表明此符号函数应该与 numpy 数组一起使用? -
你的
symInv没有意义;试试symInv(10),为什么会产生-11?它还会引发symInv(10.0)的错误。在 numpy 术语中,它是np.bitwise_xor(xx, -1)。 -
显然
sympy正在将**运算符转换为^,但在numpy 中这是逻辑xor,而不是电源。这也是一个元素操作,你想要一个矩阵求逆。在 numpy 中1/xx不是逆矩阵。 -
@hpaulj,对,我想知道是否有办法以某种方式影响这种转换..