You need to enable JavaScript to run this app. 如何基于NetworkX动态多图边列表构建边次数统计的发生矩阵
优惠活动
大模型
产品
解决方案
定价
更多

如何基于NetworkX动态多图边列表构建边次数统计的发生矩阵

原手写循环的常见问题
  • 语法错误:if 判断语句末尾缺少Python要求的冒号标识,直接运行会触发语法解析报错。
  • 变量问题:判断逻辑用到的temp0没有提前定义/赋值,初始化时错把变量名写成tempo,和后续判断用的变量名不匹配,首次循环会直接抛出变量未定义的报错。
  • 逻辑错位:进入新边的分支时,代码把正在遍历的新边对象追加到结果列表,而非上一条已经完成计数的旧边,会导致统计的边和次数完全错位。
  • 边界遗漏:整个循环结束后,最后一组连续同值边的计数没有被追加到结果列表,会丢失最后一条边的统计结果。
  • 鲁棒性差:这套逻辑完全依赖边列表的连续排序状态,只要出现相同边非连续排列的情况,统计结果就会完全失真。
可行实现方案

由于你使用的是NetworkX的MultiGraph(多重图,天然支持重复边存储),完全不需要手动写连续遍历的计数逻辑,可以直接基于图本身的存储结构完成统计,稳定性和效率远高于手写循环。

1. 基础边出现次数统计

直接遍历边列表,用字典作为计数容器,同时对无向边做端点归一(避免(13,48)和(48,13)被判定为两条不同边):

edge_occurrence = {}
for u, v in G1.edges():
    # 无向边统一按节点号从小到大排序,消除方向带来的统计误差
    edge = tuple(sorted((u, v)))
    edge_occurrence[edge] = edge_occurrence.get(edge, 0) + 1

针对你提供的边列表,最终输出的edge_occurrence结果为:

{(13, 48): 43, (13, 50): 12, (13, 67): 47, (13, 147): 18}

完全匹配实际的边出现次数。

2. 超大规模图场景的加速统计

多重图的邻接表天然存储了每对节点之间的所有重复边,不需要逐边遍历即可拿到计数:

edge_occurrence = {}
for u in G1.adj:
    for v in G1.adj[u]:
        # 邻接表中u到v的边字典长度,就是这对节点之间的重复边总数
        edge_count = len(G1.adj[u][v])
        edge = tuple(sorted((u, v)))
        # 无向图遍历邻接表会重复访问两次同一条边,只保留一次记录
        if edge not in edge_occurrence:
            edge_occurrence[edge] = edge_count

3. 构造发生矩阵

拿到边的计数字典后,可以直接基于节点列表生成符合定义的发生矩阵(行对应边、列对应节点,矩阵元素为对应边在该节点关联下的出现次数):

import numpy as np
# 整理图内所有节点并建立索引映射
node_list = sorted(G1.nodes())
node_idx_map = {node: idx for idx, node in enumerate(node_list)}
# 初始化零矩阵
occurrence_matrix = np.zeros((len(edge_occurrence), len(node_list)))
# 填充矩阵对应的值
for row_idx, ((u, v), count) in enumerate(edge_occurrence.items()):
    occurrence_matrix[row_idx, node_idx_map[u]] = count
    occurrence_matrix[row_idx, node_idx_map[v]] = count

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 13:45:05