如何基于一维向量高效创建指定重复对角结构的Numpy矩阵?
高效构建特定结构的Numpy矩阵
给定一维向量 [a, b, ...],需要快速生成如下结构的Numpy矩阵:
[[a, 0, 0], [0, a, 0], [0, 0, a], [b, 0, 0], [0, b, 0], [0, 0, b], ...]
你当前的实现方案如下:
np.squeeze(np.reshape(np.tile(np.eye(3), (len(foo), 1, 1)) * np.expand_dims(foo, (1, 2)), (1, -1, 3)))
这里提供两种更高效的实现方式:
方法一:利用克罗内克积 np.kron
克罗内克积天生适配这种“每个元素对应一个单位矩阵缩放后拼接”的场景,代码极简且高效:
import numpy as np foo = np.array([a, b, ...]) # 你的一维向量 result = np.kron(foo, np.eye(3))
原理:np.kron(foo, np.eye(3)) 会将向量中的每个元素与3阶单位矩阵做乘法,然后按顺序拼接成最终的二维矩阵,完全匹配需求。
方法二:广播+Reshape(内存更友好)
如果向量长度很大,广播机制可以避免重复复制单位矩阵,内存占用更低:
import numpy as np foo = np.array([a, b, ...]) result = (foo[:, None, None] * np.eye(3)).reshape(-1, 3)
原理:
foo[:, None, None]把一维向量转换成形状为(N, 1, 1)的三维数组(N是向量长度)- 与形状为
(3, 3)的单位矩阵广播相乘,得到(N, 3, 3)的三维数组 - 最后用
reshape(-1, 3)把三维数组展平成目标形状的二维矩阵
效率对比
这两种方法都比你现有的方案更快:
np.kron底层是优化过的C实现,代码简洁且执行高效- 广播+Reshape 避免了
np.tile带来的内存冗余,在大向量场景下优势更明显
内容的提问来源于stack exchange,提问作者MarkFloatingInSpace
相关产品推荐
相关产品推荐

