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

如何用numpy向量化运算将三维数组扩展为对角矩阵数组?

向量化实现方案

首先明确核心需求:对每个(n,m),B[n,m]是一个D×D矩阵,其左上角A[n,m]×A[n,m]区域为单位矩阵,其余位置为0(假设A[n,m] ≤ D;若A是(N,M,D)形状,且每个(n,m)对应的D个元素均为同一标量,可先通过A = A[...,0]压缩为(N,M)形状)。

方法1:广播掩码赋值

这是最直观的向量化方式,通过生成掩码定位需要设为1的对角线位置:

import numpy as np

# 示例输入
N, M, D = 2, 3, 4
A = np.random.randint(1, D+1, size=(N, M))  # 若A是(N,M,D),则A = A[..., 0]

# 初始化目标数组
B = np.zeros((N, M, D, D), dtype=A.dtype)

# 生成对角线索引
diag_indices = np.arange(D)

# 广播生成掩码:判断每个对角线位置是否在A[n,m]的范围内
mask = diag_indices < A[..., None]

# 为对角线符合条件的位置赋值1
B[..., diag_indices, diag_indices] = mask.astype(A.dtype)

方法2:基于单位矩阵模板的广播截断

先创建一个D×D的单位矩阵模板,再通过广播掩码保留对应区域:

import numpy as np

N, M, D = 2, 3, 4
A = np.random.randint(1, D+1, size=(N, M))

# 生成D×D单位矩阵模板
eye_template = np.eye(D, dtype=A.dtype)

# 扩展A的维度以匹配模板的广播要求,生成掩码
mask = np.arange(D) < A[..., None, None]

# 掩码与模板相乘得到目标数组
B = eye_template * mask

特殊情况:若A[n,m]恒等于D

如果所有A[n,m]都是D,那直接广播单位矩阵即可:

B = np.tile(np.eye(D), (N, M, 1, 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:10:34