我正在尝试在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''
如果矩阵为整数,则工作正常:
^{pr2}$Link to a live version of the code
如果有人知道任何解决办法,如果你能分享的话,那就太好了。提前谢谢。在
更新。正如@hpaulj和@tel指出的,问题是lambdify
如何将**
转换为矩阵符号的numpy代码:出于某种原因,它尝试异或元素。我会设法找到一个简单的方法来改变这种行为。如有任何帮助/提示,我们将不胜感激。在
正如hpaulj所指出的,这个错误似乎源于}的转换,这种转换发生在{}中。在
**
到{您可以通过使用
np.power
而不是**
来修复所得到的错误:输出:
^{pr2}$但是,正如您设置的那样,
symInv
不会生成矩阵的逆,而是只会对xx
中每个值的元素求幂。换句话说,symInv(xx)[i,j] == xx[i,j]**-1
。这段代码显示了元素求幂和真逆之间的区别。在输出:
编辑:解决方法
我95%肯定你遇到的是sypy代码中的一个bug。似乎
X0^-1
在某个时候是SympyMatrix
对象的有效语法,但现在不再有效。然而,似乎有人忘了告诉维护lambdify
代码的人,因为它仍然将每个矩阵求幂转换成carrot^
语法。在所以你应该提交一个关于Sympy github的问题。只需发布代码及其产生的错误,并询问这是否是预期的行为。同时,这里有一个肮脏的黑客来解决这个问题:
输出:
基本上,在将所有数组传递到
symInv
之前,必须将所有数组强制转换为瘦包装器类型XormulArray
。由于很多原因,这种方法并不是最佳实践(包括它显然打破了您对(2,2)
的形状限制),但在Sympy代码库修复之前,它可能是您能做的最好的方法。在相关问题 更多 >
编程相关推荐