如何使用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
相关产品推荐
相关产品推荐

