使用np.linalg.lstsq遇'tuple'一元运算符错误,求解原因
问题原因与解决办法
- 核心差异:两个函数的返回值类型不同
np.linalg.solve:当输入的矩阵C可逆时,直接返回方程的解数组,所以你能直接对结果加负号。np.linalg.lstsq:不管矩阵是否可逆,返回的是一个元组,里面包含4个元素:(解数组, 残差, 矩阵秩, 奇异值)。你直接对这个元组用一元负号-,自然会触发TypeError——元组不支持这种操作。
- 修正代码的正确方式
先从返回的元组里提取出解数组,再应用负号,比如:# 方法1:通过索引提取 lstsq_result = np.linalg.lstsq(C, D, rcond=None) x = -lstsq_result[0] # 方法2:解包忽略其他返回值 x, *_ = np.linalg.lstsq(C, D, rcond=None) x = -x - 补充说明
你的矩阵C是可逆方阵(不然np.linalg.solve会报错),所以lstsq得到的解和solve的解完全一致,只是lstsq额外返回了残差、秩等信息,这是两者设计定位的区别——lstsq更通用,能处理超定/欠定方程组,而solve只针对可逆方阵的精确解。
内容的提问来源于stack exchange,提问作者Accelerator
相关产品推荐
相关产品推荐

