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

如何以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:22:52