You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用Numpy实现QR分解时shape广播不匹配报错如何解决

问题原因

报错的核心是维度不匹配:

  • 输入的A是np.matrix类型,取A[:,i]返回的是shape为(3,1)的二维列向量
  • 而Q[:,i]是从二维数组里切出来的一维切片,shape为(3,)
  • 二维数组无法直接赋值给一维数组,因此触发广播报错。
解决方案

有两种常用修复方式,推荐第一种:

方案1:替换过时的np.matrix为np.array(推荐)

numpy的matrix类型已被官方标记为不推荐使用,换成标准数组类型即可规避维度问题,同时要修正矩阵乘法的写法:

  1. 把输入的np.matrix改为np.array
  2. 原代码中R = Q.T*A的*是逐元素乘法,矩阵乘法要换成@运算符或者np.dot
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:45:00