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

Python中提取多维数组内对角矩阵的对角线元素至单个数组

提取3D数组中每个子矩阵的对角线元素

针对你给出的形状为(3, 4, 4)的3D数组,这里有几种简洁的NumPy方法可以提取每个子矩阵的对角线元素,得到目标数组:

方法1:使用np.diagonal()函数

这是最直接的方法,通过指定子矩阵对应的轴参数即可:

import numpy as np

A = np.array([[[1 , 0, 0, 0],
               [0 , 2, 0, 0],
               [0 , 0, 3, 0],
               [0 , 0, 0, 4]],

              [[5 , 0, 0, 0],
               [0 , 6, 0, 0],
               [0 , 0, 7, 0],
               [0 , 0, 0, 8]],

             [[9 , 0, 0, 0],
              [0 , 10, 0, 0],
              [0 , 0, 11, 0],
              [0 , 0, 0, 12]]])

# 提取每个子矩阵的对角线,axis1和axis2对应子矩阵的行、列轴
B = A.diagonal(axis1=1, axis2=2)
print(B)
# 输出:
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

方法2:利用数组索引直接取值

对角线元素的位置是每个子矩阵中行索引等于列索引的位置,通过索引匹配即可:

# 生成0-3的索引序列,对应每个子矩阵的对角线位置
diag_indices = np.arange(4)
B = A[:, diag_indices, diag_indices]
print(B)
# 输出结果与方法1一致

方法3:使用np.take_along_axis()(灵活适配不同场景)

如果需要更灵活地指定提取位置,可结合该函数:

# 创建与A的轴2匹配的索引数组
idx = np.arange(4)[None, :, None]
# 沿轴2提取对应索引的元素,再压缩维度
B = np.take_along_axis(A, idx, axis=2).squeeze(axis=2)
print(B)
# 输出结果与前两种方法一致

内容的提问来源于stack exchange,提问作者learning statistics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:23:33