Python使用NumPy/SymPy计算含SymPy元素复矩阵逆报错咨询
问题
现有一个8*8阶复矩阵A,调用np.linalg.inv(b)计算逆矩阵时触发如下报错:
UFuncTypeError: Cannot cast ufunc 'inv' input from dtype('O') to dtype('float64') with casting rule 'same_kind'
矩阵属性查询结果:
In [169]: type(A) Out[169]: numpy.matrix In [171]: type(A[0,0]) Out[171]: sympy.core.mul.Mul
核心疑问:矩阵外层是NumPy矩阵类型,内部元素为SymPy类型,求逆应该选择NumPy还是SymPy库?
解答
报错根因
外层NumPy矩阵只是容器,由于内部元素是SymPy符号对象,矩阵实际的dtype为object。NumPy线性代数模块仅支持原生数值类型(int、float、complex等)的运算,无法处理SymPy符号对象,因此触发类型转换失败。
NumPy和SymPy属于完全独立的两个计算生态,前者面向高性能数值计算,后者面向符号推导,二者对象混用时会自动降级为object类型数组,几乎所有NumPy数值运算接口都无法正常处理这类数组,根据你的需求二选一即可:
方案1:需要符号形式的精确逆矩阵
使用SymPy原生接口计算,不要调用NumPy方法:
- 先将现有NumPy矩阵转换为SymPy矩阵对象:
sym_A = sp.Matrix(A) - 直接调用SymPy矩阵的求逆方法:
sym_A_inv = sym_A.inv()
该方法返回的是精确符号表达式,无浮点误差,适合后续需要做公式化简、符号推导的场景。
方案2:只需要数值形式的近似逆矩阵
先将所有SymPy元素转换为NumPy支持的复数数值类型,再调用NumPy求逆:
- 完成类型转换:
num_A = np.array(A, dtype=np.complex128) - 执行求逆:
num_A_inv = np.linalg.inv(num_A)
注意:如果矩阵元素中包含未赋值的符号变量,该转换会报错,必须先给所有符号传入具体数值完成代入后再做转换。
内容的提问来源于stack exchange,提问作者Amin Azimi
相关产品推荐
相关产品推荐

