You need to enable JavaScript to run this app. 如何高效将二维numpy数组的各对角线转换为补0填充的行
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将二维numpy数组的各对角线转换为补0填充的行

高效实现方案

你可以通过numpy矢量化索引实现,完全避免Python层面的循环,性能最优,实现代码如下:

import numpy as np

# 输入数组
A = np.array([[1, 7, 5, 0, 5],
              [9, 1, 4, 6, 0],
              [9, 6, 1, 0, 0],
              [2, 5, 0, 0, 0],
              [1, 0, 0, 0, 0]])

n = A.shape[0]
# 生成列索引矩阵
col_idx = np.arange(n)[np.newaxis, :].repeat(n, axis=0)
# 生成对应A的行索引矩阵
row_idx = np.arange(n)[:, np.newaxis] - col_idx
# 构造有效位置掩码(j <= i的位置需要赋值)
mask = col_idx <= np.arange(n)[:, np.newaxis]

# 初始化B为全0数组
B = np.zeros_like(A)
# 直接批量赋值
B[mask] = A[row_idx[mask], col_idx[mask]]

运行后得到的B就是你需要的结果:

array([[1, 0, 0, 0, 0],
       [9, 7, 0, 0, 0],
       [9, 1, 5, 0, 0],
       [2, 6, 4, 0, 0],
       [1, 5, 1, 6, 5]])

更易理解的实现(适合小数据量)

如果你的数组规模不大,也可以用提取对角线的方式实现,逻辑更直观:

import numpy as np

A = np.array([[1, 7, 5, 0, 5],
              [9, 1, 4, 6, 0],
              [9, 6, 1, 0, 0],
              [2, 5, 0, 0, 0],
              [1, 0, 0, 0, 0]])

n = A.shape[0]
B = np.zeros_like(A)
# 上下翻转A
A_flip = np.flipud(A)

for k in range(-(n-1), 1):
    diag_vals = np.diag(A_flip, k=k)
    row_idx = n + k - 1
    B[row_idx, :len(diag_vals)] = diag_vals

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 00:45:07