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

如何基于一维向量高效创建指定重复对角结构的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:45:30