如何生成无自重复列表以构建COO格式对角线为0的邻接矩阵
生成对角线为0的全连接邻接矩阵COO格式的实现方案
以下几种方法都能满足你固定结构的需求,无需使用random.shuffle:
方案1:纯Python迭代实现(通用型)
通过列表推导和itertools工具生成符合要求的row和col列表,逻辑清晰,不依赖第三方数值库:
from itertools import chain import scipy.sparse n = 3 # 可替换为任意正整数 items = list(range(n)) # 生成row列表:每个节点索引重复n-1次(对应连接n-1个其他节点) row = [i for i in items for _ in range(n-1)] # 等价于用itertools.repeat的写法:row = list(chain(*repeat(items, n-1))) # 生成col列表:每个节点索引对应的col是排除自身的所有其他节点索引 col = list(chain(*[[j for j in items if j != i] for i in items])) value = [1] * len(row) # 构造COO矩阵 mtx = scipy.sparse.coo_matrix((value, (row, col)), shape=(n, n)) print(mtx.todense())
运行后会输出目标邻接矩阵,该方案适用于任意规模的节点数n。
方案2:基于numpy的高效实现(大规模场景)
当节点数n较大时,用numpy的矩阵操作能大幅提升效率,直接定位非对角线元素的位置:
import numpy as np import scipy.sparse n = 3 # 生成所有i≠j的索引对(非对角线位置) i, j = np.where(np.eye(n) == 0) row = i.tolist() col = j.tolist() value = np.ones(len(row)).tolist() mtx = scipy.sparse.coo_matrix((value, (row, col)), shape=(n, n)) print(mtx.todense())
np.eye(n)生成单位矩阵,np.where筛选出所有值为0的位置(即非对角线),直接得到对应的row和col索引。
方案3:手动构造(小节点数场景)
如果仅针对固定小节点数(比如你的n=3场景),可以直接手动定义row和col列表:
import scipy.sparse row = [0, 0, 1, 1, 2, 2] col = [1, 2, 0, 2, 0, 1] value = [1] * 6 mtx = scipy.sparse.coo_matrix((value, (row, col)), shape=(3, 3)) print(mtx.todense())
以上所有方案生成的row和col都有固定的对应关系,完全符合COO格式的要求,不会出现随机打乱的问题。
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

