NetworkX
是一个用于创建、操作和研究复杂网络的结构、动态和功能的 Python 包。它提供了丰富的数据结构和函数,便于处理图和网络。下面是NetworkX
包的一些主要功能:
图的创建与操作:
图的测量与分析:
图的可视化:
- 虽然
NetworkX
本身的可视化功能有限,它可以与其他库(如 Matplotlib)配合,来创建图形的视觉表示。- 支持定制节点和边的样式、布局等。
图与数据结构的兼容性:
- 可以从多种数据格式导入和导出图,如边列表、邻接矩阵、GEXF、GraphML、Pickle等。
- 方便与 Pandas 和 NumPy 等数据处理库配合使用,进行数据分析和处理。
算法支持:
- 包括经典的图论算法,例如 Dijkstra、Floyd-Warshall、Prim、Kruskal 等。
- 支持更复杂的结构如生成树、网络流、路径算法等。
这些功能使得
NetworkX
成为在学术研究和实际应用中分析和可视化网络数据的有力工具。
目录
networkx%E6%A8%A1%E5%9D%97%E5%AE%89%E8%A3%85%E5%92%8C%E8%B0%83%E7%94%A8-toc" style="margin-left:0px;">一、networkx模块安装和调用
二、使用
生成图
读取图
获取图的点与边
获取点的邻居与权重
判断是否存在节点/边
修改图
添加/删除节点
添加/删除边
为边添加权重
对graph的node节点重新编号
networkx%E6%A8%A1%E5%9D%97%E5%AE%89%E8%A3%85%E5%92%8C%E8%B0%83%E7%94%A8">一、networkx模块安装和调用
python">pip install networkx
import networkx as nx
二、使用
生成图
生成图主要有 nx.DiGraph 有向图和 nx.Graph 无向图两种,除了图的不同外,边可以区分为有权重和无权重,下面介绍生成带权重有向图的方法,无向图和无权重可以参考类似生成方法。
python">import networkx as nx
import randomdef createGraph():f = open(edge_file, "w")for i in range(node_num):node_from = random.randint(0, 1000)node_to = random.randint(0, 1000)weight = random.random()if node_from != node_to:f.write("%s %s %s\n" % (node_from, node_to, weight))f.close()# 1.构造图
edge_file = "graph_edge.txt"
node_num = 1000
createGraph()
这里随机生成一些测试数据,node_from 和 node_to 分别代表起始点,createGraph 方法会生成约 node_num 条带权重边,示例如下,起始点已经通过数字标识,权重通过 float 的形式给出:
读取图
上述方法生成了图的模拟节点,下面通过 nx.read_edgelist 方法读取图的边与权重,node_from 和 node_to 为节点,create_using 选择 nx.DiGraph 则为有向图,选择 nx.Graph 则为无向图,nodetype 可以选择None,也可以选择对应类型,例如 int 等等,data 为我们对边的附属描述,这里第三列我们规定其为 float 类型的 weight。
python">def loadGraph(fileName):G = nx.read_edgelist(fileName, create_using=nx.DiGraph(), nodetype=None, data=[('weight', float)])return GG = loadGraph(edge_file)
获取图的点与边
G.nodes() 获取图中全部点,number_of_nodes() 获取图中顶点的数量,可以通过 for 循环遍历 nodes,也可以通过 list(G.nodes()) 包装执行其他的迭代操作。
G.edges() 获取图中全部边,如果需要显示边的附加信息,例如上例中我们添加了 weight 选项,data=Teue 则可以保证信息全部打印,G.number_of_edges() 获取全部边的数量。
python">print("节点和边的个数:", G.number_of_nodes(), G.number_of_edges())
# # 获取路网的每条节点/边属性信息
print("节点和边:", list(G.nodes(data=True))[0], list(G.edges(data=True))[0])
获取点的邻居与权重
获取相关顶点的邻居,可以通过 nx 的 neighbors 方法获取对应顶点的邻居以及与对应邻居的权重(如果有)。
python"># 4.获取节点邻居
for node in G.nodes:nbrs = list(G.neighbors(node))weights = []for nbr in nbrs:weights.append(G[node][nbr]["weight"])print("节点", node, "的邻居:", nbrs, "对应权重", weights)break
判断是否存在节点/边
Graph.has_edge(u, v),其中参数: u, v (节点) ,返回值:如果有边则返回True,否则返回False。
python"># 判断是否存在
print(G.has_node('221'))
print(G.has_edge('221', '5221'))
修改图
通过上面的操作,已经可以从基础的数据中生成图并获取图的顶点与边,接下来需要对图进行微调,则需要增删改查的方法,下面介绍常用的方法:
添加/删除节点
可以一次添加一个节点,或从任何 iterable 容器,如列表
python"># 添加/删除 节点
G.add_node('10')
G.add_nodes_from(['1', '2', '3']) # 批量添加
G.remove_node('10')
G.remove_nodes_from(['1', '2', '3']) # 批量删除
添加/删除边
G
也可以通过一次添加一个边来生长,或者通过添加边列表,
python"># 添加/删除 边
G.add_edge('1', '2')
G.add_edges_from([('1', '2'), ('3', '4')]) # 批量添加
G.remove_edge('1', '2')
G.remove_edges_from([('1', '2'), ('3', '4')]) # 批量删除
为边添加权重
python"># 为边添加权重
G.add_edge('1', '2')
G.edges['1', '2']['weight'] = 0.33
对graph的node节点重新编号
python">import networkx as nx# 创建一个示例图
G = nx.DiGraph()
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5)])# 创建一个新的节点编号映射字典
new_node_labels = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}# 使用relabel_nodes重新编号节点
H = nx.relabel_nodes(G, new_node_labels)# 输出重新编号后的图
print("Original Graph:")
print(G.nodes)
print(G.out_degree())
print("Graph after relabeling nodes:")
print(H.nodes)
print(H.out_degree())