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

如何使用NumPy将矩阵元素对角填充至目标矩阵?

问题描述

给定5×5数组arr1:

arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])

以及初始化的10×10全NaN矩阵:

matrix = np.zeros((10, 10))
matrix[:] = np.NaN

需要将arr1的元素按指定对角方式填充到matrix中,预期输出如下:

array([[ nan, nan, nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 1,   nan, nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 6,   2,   nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 11,  7,   3,    nan,  nan, nan, nan, nan, nan, nan],
       [ 16,  12,  8,    4,    nan, nan, nan, nan, nan, nan],
       [ 21,  17,  13,   9,    5,   nan, nan, nan, nan, nan],
       [ nan, 22,  18,   14,   10,  nan, nan, nan, nan, nan],
       [ nan, nan, 23,   19,   15,  nan, nan, nan, nan, nan],
       [ nan, nan, nan,  24,   20,  nan, nan, nan, nan, nan],
       [ nan, nan,  nan, nan,  25,  nan, nan, nan, nan, nan]])

当前尝试的代码未实现需求,代码如下:

arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
matrix = np.zeros((10, 10))
matrix[:] = np.NaN

for i, array in enumerate(arr1):                                 
    for row_matrix in matrix:
        row_matrix = np.diag(array, -i-1)
        break

得到的错误输出:

array([[ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 21, 0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, 22,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 23,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, 24,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0, 25,  0,  0,  0,  0,  0]])
错误原因分析
  • 原代码中row_matrix = np.diag(array, -i-1)仅创建了新的对角数组,并未修改原始matrix——row_matrix只是matrix行的副本,赋值操作不会影响原矩阵。
  • 循环逻辑混乱:外层循环遍历arr1的行,但内层循环仅执行一次就break,无法完成所有元素的填充。
正确实现方法

方法1:嵌套循环实现

核心逻辑:arr1中位置(r, c)的元素,对应matrix中的行列索引为(r + c + 1, c)(其中r是arr1的行号,范围0-4;c是arr1的列号,范围0-4)。

import numpy as np

arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
matrix = np.zeros((10, 10))
matrix[:] = np.NaN

# 遍历arr1的每个元素
for r in range(arr1.shape[0]):
    for c in range(arr1.shape[1]):
        target_row = r + c + 1
        matrix[target_row, c] = arr1[r, c]

print(matrix)

方法2:向量化实现(更高效)

利用numpy的索引特性批量处理,避免循环:

import numpy as np

arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
matrix = np.full((10, 10), np.nan)

# 生成arr1所有元素的行列索引
r, c = np.indices(arr1.shape)
# 计算目标行索引
target_rows = r + c + 1
# 批量赋值
matrix[target_rows, c] = arr1

print(matrix)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:35:48