如何将NumPy一维数组转换为对角线为0的类邻接矩阵?
解决NumPy一维数组转对角线为0的类邻接矩阵问题
问题分析
你需要将长度为10的一维数组转换为5×5的严格下三角矩阵(对角线为0),元素按列优先填充到i>j的位置。核心是精准定位这些下三角区域的索引,再批量赋值。
实现代码
import numpy as np # 原始一维数组 arr = np.array([1,2,3,4,5,6,7,8,9,10]) # 计算目标矩阵的维度n(满足n*(n-1)/2 = 数组长度) n = int((1 + np.sqrt(1 + 8 * len(arr))) // 2) # 创建全零矩阵 mat = np.zeros((n, n), dtype=int) # 获取严格下三角区域(i>j)的索引(按列优先顺序) i_indices, j_indices = np.tril_indices(n, k=-1) # 为下三角区域赋值 mat[i_indices, j_indices] = arr print(mat)
输出结果
[[0 0 0 0 0] [1 0 0 0 0] [2 5 0 0 0] [3 6 8 0 0] [4 7 9 10 0]]
扩展:生成对称矩阵(包含上下三角)
如果需要生成对称的邻接矩阵,只需在赋值时同时填充上三角区域:
# 填充对称位置 mat[j_indices, i_indices] = arr print(mat)
输出:
[[0 1 2 3 4] [1 0 5 6 7] [2 5 0 8 9] [3 6 8 0 10] [4 7 9 10 0]]
关键说明
np.tril_indices(n, k=-1)会返回所有满足i>j的索引对,且顺序正好是列优先(先填第0列的下三角,再第1列,以此类推),完美匹配你的需求。- 矩阵维度
n通过三角数公式计算:由n*(n-1)/2 = len(arr)推导得出,确保适配任意长度的三角数数组。
内容的提问来源于stack exchange,提问作者lindak
相关产品推荐
相关产品推荐

