如何用Numpy将小矩阵插入大零矩阵指定位置并解决广播报错
矩阵插入报错解决方案
报错原因
你当前报错的核心原因是循环过程中小矩阵插入的位置超出了大矩阵的边界:
- 你定义的大矩阵
K尺寸是40×40(索引范围0~39) - 小矩阵
k是6×6尺寸,插入时需要大矩阵预留出连续6行6列的空间 - 循环范围设为
range(ndofs)也就是i会取到38,当3*i +6 > 40时,numpy会自动把切片截断到数组边界,此时切片形状小于6×6,就会触发形状不匹配的广播错误。
问题解答
1. 如何指定位置将小矩阵插入到零矩阵
满足两个前提即可:
- 确认小矩阵尺寸为
m×n,要插入到大矩阵的起始行索引为row_start,起始列索引为col_start - 保证
row_start + m ≤ 大矩阵行数、col_start + n ≤ 大矩阵列数,避免越界
通用语法如下:
大矩阵[row_start : row_start + m, col_start : col_start + n] = 小矩阵
2. 如何将小矩阵插入到40*40零矩阵的第23行开始的位置
注意numpy数组索引从0开始计数:
- 如果你说的「第23行」是日常计数的第23行,对应索引为22
- 如果你说的「第23行」是编程语境下从0开始数的第23位,对应索引为23
示例代码(以从索引23行、索引23列开始插入为例):
import numpy as np K = np.zeros((40,40)) k = np.array( [ [ 1, 0, 1, 0, 0, 0 ], [ 0, 12, 6, 0, -12, 6 ], [ 0, 6 , 4, 0, -6, 2 ], [ 1, 0, 0, 1, 0, 0 ], [ 0, -12, -6, 0, 12, 6 ], [ 0, 6, 2, 0, -6, 4 ] ] ) # 从23行23列开始插入,切片长度刚好6,不会越界 K[23:23+6, 23:23+6] = k
原有代码修复方案
你原代码的循环逻辑是每隔3行/列插入一次6×6矩阵,只需要把循环范围改成不会越界的区间即可:
import numpy as np ndofs = 39 k = np.array( [ [ 1, 0, 1, 0, 0, 0 ], [ 0, 12, 6, 0, -12, 6 ], [ 0, 6 , 4, 0, -6, 2 ], [ 1, 0, 0, 1, 0, 0 ], [ 0, -12, -6, 0, 12, 6 ], [ 0, 6, 2, 0, -6, 4 ] ] ) K = np.zeros((ndofs+1,ndofs+1)) # 计算循环最大i值,保证3*i+6 <= 40 max_i = (K.shape[0] - 6) // 3 for i in range(max_i + 1): K_temp = np.zeros_like(K) K_temp[3*i:3*i+6, 3*i:3*i+6] = k K += K_temp print(K)
内容的提问来源于stack exchange,提问作者RAKSHIT SELOT
相关产品推荐
相关产品推荐

