如何以Pythonic方式按指定规则由小矩阵生成更大矩阵?
解决方案
嘿,这个矩阵构造需求其实可以用几种非常Pythonic的方式实现,不用再纠结numpy.kron或者repeat的问题啦~先看最直观的两种方法:
方法一:直接块赋值(最简洁)
这种方式利用numpy的广播特性,直接给目标矩阵的对应区域赋值,逻辑清晰又高效:
import numpy as np # 初始化原矩阵 x = np.arange(0,9,1).reshape((3,3)) # 创建9×9的零矩阵作为结果容器 result = np.zeros((9,9), dtype=int) # 给对应区域赋值:前三行的前3列重复x的第一行 result[:3, :3] = x[0] # 中间三行的中间3列重复x的第二行 result[3:6, 3:6] = x[1] # 最后三行的最后3列重复x的第三行 result[6:9, 6:9] = x[2] print(result)
运行后就能得到你想要的输出,numpy会自动把单行的x[i]广播到3行的区域,完全符合需求。
方法二:行模板+重复拼接
如果更倾向于先构造单行模板再重复,也可以用np.hstack和np.tile组合实现,代码可读性也很强:
import numpy as np x = np.arange(0,9,1).reshape((3,3)) # 构造三个行模板,分别补对应数量的零 row_template_0 = np.hstack([x[0], np.zeros(6, dtype=int)]) row_template_1 = np.hstack([np.zeros(3, dtype=int), x[1], np.zeros(3, dtype=int)]) row_template_2 = np.hstack([np.zeros(6, dtype=int), x[2]]) # 每个模板重复3行,再垂直拼接 result = np.vstack([ np.tile(row_template_0, (3,1)), np.tile(row_template_1, (3,1)), np.tile(row_template_2, (3,1)) ]) print(result)
如果想更紧凑,还可以用列表推导式简化:
result = np.vstack([ np.tile(np.hstack([np.zeros(i*3, dtype=int), x[i], np.zeros(6-i*3, dtype=int)]), (3,1)) for i in range(3) ])
为啥之前的kron/repeat没成功?
numpy.kron是做克罗内克积,它的逻辑是把原矩阵的每个元素扩展成块,和你需要的“整行偏移+重复”逻辑不太匹配;而repeat默认是对元素或轴重复,但没法直接实现“行重复+位置补零”的组合需求,所以用上面的两种方法会更直接~
内容的提问来源于stack exchange,提问作者Francesco Di Lauro
相关产品推荐
相关产品推荐

