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

如何无需循环快速将Numpy矩阵扩展为对角块结构矩阵?

高效实现矩阵的特殊n倍扩展(无显式循环)

需求说明

给定一个方阵(示例如下),需要将其扩展n倍(示例中n=3),使原矩阵的每个元素对应目标矩阵中的n×n对角块(对角线上为该元素,其余为0),矩阵其余位置均为0。

原矩阵:

matrix = [[ 1, 2, 3, 4, 5],
          [ 6, 7, 8, 9,10],
          [11,12,13,14,15],
          [16,17,18,19,20],
          [21,22,23,24,25]]

目标扩展矩阵(n=3时):

goal_matrix = [[ 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0],
               [ 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0],
               [ 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5],
               [ 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0,10, 0, 0],
               [ 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0,10, 0],
               [ 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0,10],
               [11, 0, 0,12, 0, 0,13, 0, 0,14, 0, 0,15, 0, 0],
               [ 0,11, 0, 0,12, 0, 0,13, 0, 0,14, 0, 0,15, 0],
               [ 0, 0,11, 0, 0,12, 0, 0,13, 0, 0,14, 0, 0,15],
               [16, 0, 0,17, 0, 0,18, 0, 0,19, 0, 0,20, 0, 0],
               [ 0,16, 0, 0,17, 0, 0,18, 0, 0,19, 0, 0,20, 0],
               [ 0, 0,16, 0, 0,17, 0, 0,18, 0, 0,19, 0, 0,20],
               [21, 0, 0,22, 0, 0,23, 0, 0,24, 0, 0,25, 0, 0],
               [ 0,21, 0, 0,22, 0, 0,23, 0, 0,24, 0, 0,25, 0],
               [ 0, 0,21, 0, 0,22, 0, 0,23, 0, 0,24, 0, 0,25]]

解决方案:使用NumPy的克罗内克积(np.kron)

无需编写任何显式循环,利用NumPy内置的向量化操作即可高效实现需求:

import numpy as np

# 将原列表矩阵转为NumPy数组
matrix_np = np.array(matrix)
n = 3  # 扩展倍数

# 生成目标矩阵
goal_matrix_np = np.kron(matrix_np, np.eye(n, dtype=int))

# 若需要转回列表格式
goal_matrix = goal_matrix_np.tolist()

原理说明

np.kron(a, b) 计算两个数组的克罗内克积,对于原矩阵的每个元素x,会将其与第二个参数np.eye(n)(n阶单位矩阵)相乘,得到一个n×n的对角矩阵(对角元素为x,其余为0)。将所有这些小矩阵按原矩阵的元素位置拼接,正好得到目标扩展矩阵。该操作完全由NumPy底层优化实现,效率远高于手动循环。

内容的提问来源于stack exchange,提问作者Olivér Palotás

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:25:31