如何将可变大小行矩阵嵌入大矩阵类对角线位置?代码报错求解
解决Numpy矩阵类对角线赋值的错误问题
我来帮你排查问题并修正代码~你遇到的ValueError主要是索引逻辑和数据类型的问题,咱们一步步理清楚:
错误根源
t的类型不匹配:你定义的t是普通Python列表,没有shape属性(虽然你给出的错误提示里有(1,3),推测你实际可能转成数组了,但还是有索引问题)- 索引范围逻辑错误:循环里
i从0开始,i-1会变成-1,导致行切片i-1:i-1+t.shape[0]在第一次循环时出现异常范围,甚至空切片,直接触发了广播不匹配的错误 - 行列切片维度不匹配:你想给单行赋值,但切片的行范围没有和
t的形状对应上,导致无法正常广播
修正后的代码
import numpy as np t = np.array([1,2,3]) # 转为numpy数组,方便处理形状和广播 n = 3 m = 4 # 初始化目标矩阵,和你期望的8行16列维度一致 A = np.zeros((2*m, m*n + m), dtype=int) for i in range(m): # 行索引:直接取第i行(对应你期望的前4行依次放置t) # 列索引:从n*i开始,长度为t的元素个数 A[i, n*i : n*i + t.size] = t print("A= \n", np.matrix(A))
代码解释
- 将
t转为numpy数组,用t.size获取元素个数比shape更直观,也能避免列表无shape属性的问题 - 循环时行直接取
i(从0到3),刚好对应你期望的前4行分别放置t - 列起始位置设为
n*i,让每个t依次落在0:3、3:6、6:9、9:12的位置,完美匹配你要的类对角线布局 - 直接用
A[i, ...] = t赋值,numpy会自动把一维数组t匹配到单行切片位置,避免广播错误
输出结果
运行后会得到你期望的矩阵:
A= [[1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 1 2 3 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 1 2 3 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 1 2 3 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
内容的提问来源于stack exchange,提问作者DogeProgrammer
相关产品推荐
相关产品推荐

