如何无需循环快速将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
相关产品推荐
相关产品推荐

