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

如何用Numpy高效填充5×3×3数组中每个3×3块的对角线?

嘿,这个需求用Numpy完全可以高效实现,不用写繁琐的嵌套循环,我给你分享两种实用的方法:

方法一:直接利用高级索引赋值(适合已有全零数组的场景)

如果已经初始化了全零的5×3×3数组,我们可以通过Numpy的广播式高级索引直接定位所有子块的对角线位置,一次性完成赋值:

import numpy as np

# 初始化目标形状的全零数组
arr = np.zeros((5, 3, 3))

# 准备每个子块的对角线数值(替换成你需要的数值即可)
diag_values = np.array([
    [0.07735655, 0.11476396, 0.09903619],
    [0.1923885, 0.03063454, 0.06028193],
    [0.06566275, 0.03151423, 0.04042383],
    [0.07950743, 0.03250461, 0.0448308],
    [0.10879917, 0.04700161, 0.03924387]
])

# 定位所有对角线位置并赋值
arr[np.arange(5)[:, None], np.arange(3), np.arange(3)] = diag_values

原理说明:

  • np.arange(5)[:, None] 把一维的[0,1,2,3,4]转变成形状为(5,1)的数组,这样能和np.arange(3)(形状(3,))进行广播,生成所有子块的对角线索引:(0,0,0)、(0,1,1)、(0,2,2)、(1,0,0)...直到(4,2,2)。
  • 这种方式是纯矢量操作,没有Python层面的循环,效率拉满。

方法二:直接构造对角块再堆叠(适合从对角值生成目标数组)

如果还没初始化数组,直接从对角线数值生成目标数组会更简洁:

import numpy as np

# 同样准备对角线数值
diag_values = np.array([
    [0.07735655, 0.11476396, 0.09903619],
    [0.1923885, 0.03063454, 0.06028193],
    [0.06566275, 0.03151423, 0.04042383],
    [0.07950743, 0.03250461, 0.0448308],
    [0.10879917, 0.04700161, 0.03924387]
])

# 对每一行对角值生成3×3对角矩阵,再堆叠成5×3×3数组
arr = np.stack([np.diag(row) for row in diag_values])

原理说明:

  • np.diag(row) 会把输入的一维数组转换成对应的对角矩阵,比如输入[a,b,c]就得到[[a,0,0],[0,b,0],[0,0,c]]。
  • np.stack() 把5个3×3的对角矩阵沿第一个维度堆叠,直接得到目标形状的数组,代码可读性非常好。

扩展:随机生成对角线数值

如果你的对角线数值是随机生成的(比如用于测试),可以用以下方式快速实现:

# 生成5组、每组3个随机数作为对角线值
random_diag = np.random.rand(5, 3)
# 方法一赋值
arr = np.zeros((5,3,3))
arr[np.arange(5)[:, None], np.arange(3), np.arange(3)] = random_diag

# 或者方法二直接生成
arr = np.stack([np.diag(np.random.rand(3)) for _ in range(5)])

内容的提问来源于stack exchange,提问作者Ahmed Junaid Khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:28