使用NetworkX与Python提取仅含2个节点的孤立子图
提取NetworkX中仅含2个节点的孤立子图及生成簇列表
一、提取仅含2个节点的孤立子图
这类子图本质是大小为2的连通分量,且两个节点仅通过单条边连接(每个节点的度为1)。具体实现步骤如下:
1. 构建图结构
先基于你的数据表构建NetworkX无向图:
import networkx as nx import pandas as pd # 读取数据表(替换为你的实际文件路径) df = pd.read_csv('your_data.csv') # 从DataFrame生成无向图,保留distance边属性 G = nx.from_pandas_edgelist(df, source='Name1', target='Name2', edge_attr='distance')
2. 筛选目标子图
通过连通分量筛选出符合条件的子图:
# 获取图中所有连通分量 all_components = list(nx.connected_components(G)) # 筛选出仅含2个节点的分量 two_node_components = [comp for comp in all_components if len(comp) == 2] # 可选:额外验证每个节点的度为1(确保是单条边连接的孤立对,排除多重边场景) two_node_components = [comp for comp in two_node_components if all(G.degree(node) == 1 for node in comp)]
3. 输出结果
将结果转换为边列表格式方便查看:
# 转换为元组形式的边列表 two_node_pairs = [tuple(comp) for comp in two_node_components] print("仅含2个节点的孤立子图对:") for pair in two_node_pairs: print(pair)
二、生成簇列表
这里的“簇”对应图中的连通分量——即图中互相连通的节点集合,不同簇之间没有边连接。直接获取所有连通分量即可:
# 获取所有簇(连通分量) clusters = list(nx.connected_components(G)) # 可选:按簇的大小从大到小排序 sorted_clusters = sorted(clusters, key=lambda x: len(x), reverse=True) print("所有簇列表:") for idx, cluster in enumerate(sorted_clusters, 1): print(f"簇{idx}: {cluster}")
说明
从你提供的示例数据和图来看,示例图中存在一个以BBB为中心的大簇,以及若干两两相连的孤立小簇,上述代码可准确提取这些孤立对,并输出所有簇的集合。
内容的提问来源于stack exchange,提问作者LascieL
相关产品推荐
相关产品推荐

