Python用Numpy实现QR分解时shape广播不匹配报错如何解决
问题原因
报错的核心是维度不匹配:
- 输入的A是
np.matrix类型,取A[:,i]返回的是shape为(3,1)的二维列向量 - 而
Q[:,i]是从二维数组里切出来的一维切片,shape为(3,) - 二维数组无法直接赋值给一维数组,因此触发广播报错。
解决方案
有两种常用修复方式,推荐第一种:
方案1:替换过时的np.matrix为np.array(推荐)
numpy的matrix类型已被官方标记为不推荐使用,换成标准数组类型即可规避维度问题,同时要修正矩阵乘法的写法:
- 把输入的
np.matrix改为np.array - 原代码中
R = Q.T*A的*是逐元素乘法,矩阵乘法要换成@运算符或者np.dot - main函数接收返回值时要同时接Q和R两个返回值
修正后完整代码如下:
import numpy as np def QRfactorization(A): # 获取矩阵尺寸 N = len(A) # 预分配Q矩阵 Q = np.zeros((N, N)) for i in range(N): u = A[:,i] for j in range(i): # 计算投影 h = np.vdot(u,Q[:,j]) u = u - h*Q[:,j] norm = np.linalg.norm(u) # 增加奇异矩阵判断,避免除零报错 if norm < 1e-10: Q[:,i] = u else: Q[:,i] = u / norm # 计算R矩阵,用@做矩阵乘法 R = Q.T @ A return Q , R def main(): # 输入替换为np.array,测试用满秩矩阵 A = np.array([[1,2,3],[4,5,6],[7,8,10]]) Q, R = QRfactorization(A) print("Q矩阵:\n", Q) print("R矩阵:\n", R) main()
方案2:不修改输入类型,手动降维u
如果必须保留np.matrix作为输入,只需要在赋值时把u转为一维即可,把报错行改为:Q[:,i] = (u / norm).squeeze()
使用.flatten()、.ravel()也可以实现相同的降维效果。
其他注意事项
你给出的初始测试用例A是秩为2的奇异矩阵,迭代到第三列时norm会为0,触发除零报错,测试时建议换成满秩矩阵。
内容的提问来源于stack exchange,提问作者Spring Breeze
相关产品推荐
相关产品推荐

