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

如何生成无自重复列表以构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:35:17