NetworkX 是一个 Python 包,常用于创建、操作和挖掘图/复杂网络
- 支持以标准和非标准数据格式加载和存储网络
- 生成多种类型的随机和经典网络;网络可视化
- 分析网络结构、构建网络模型、设计新的网络算法
本教程默认使用 NetworkX=3.2.1
1 图的基本操作
1.1 图的创建与类型
G = nx.Graph() # 无向图
print(G.is_directed()) # True
H = nx.DiGraph() # 有向图
print(H.is_directed()) # False
G.graph["Name"] = "Bar" # 添加图的属性
print(G.graph)
nx.write_gml(G, "path.to.file") # 图的存储
mygraph = nx.read_gml("path.to.file") # 图的读取
1.2 节点的创建与属性
G.add_node(0, feature=5, label=0) # 添加一个带有属性的节点
G.add_nodes_from([1,2]) # 添加多个不带有属性的节点
G.add_nodes_from([ # 添加多个带有属性的节点
(1, {"feature": 1, "label": 1}),
(2, {"feature": 2, "label": 2})
]) #(node, attrdict)
G.nodes(data=True) # 查看所有节点
G.nodes[0] # 查看单个节点的属性
G.number_of_nodes() # 查看节点数
G.remove_node(0) # 删除单个节点
G.remove_nodes_from([1,2]) # 删除多个节点
1.3 边的创建与属性
G.add_edge(0, 1, weight=0.5) # 添加一个带有属性的边
G.add_edges_from([(1, 2), (1, 3)]) # 添加多个不带有属性的边
G.add_edges_from([ # 添加多个带有属性的边
(1, 2, {"weight": 0.3}),
(2, 0, {"weight": 0.1})
])
G.edges() # 查看所有边
G.edges[(0, 1)] # 查看单个边的属性
G.number_of_edges() # 查看边数
G.remove_edge(1,3) # 删除单个边
G.remove_edges_from([(1, 2), (1, 3)]) # 删除多个边
1.4 其他注意事项
- NetworkX 中节点可以是任何可哈希对象,例如字符串、图、XML 对象等
- 一个图中的节点可以直接合并到另一个图中:
G.add_nodes_from(H)
2 图的进阶操作
2.1 度、邻节点、最短路径、PageRank
node_id = 1
G.degree[node_id] # 查看节点1的度
G.neighbors(node_id) # 查看节点1的邻节点
G.adj[node_id] # 查看节点1的邻节点(等价写法)
nx.shortest_path(G, 1, 3) # 查看最短路径
G.clear() # 清空图,删除所有节点和边
# 构建一个长度为4的路径,并作为图的初始化
# 然后使用PageRank计算每个节点的重要性
num_nodes = 4
G = nx.DiGraph(nx.path_graph(num_nodes))
nx.draw(G, with_labels = True) # 图的可视化
nx.pagerank(G, alpha=0.8)
2.2 有向图的额外属性和方法
DG = nx.DiGraph()
DG.add_weighted_edges_from([(1, 2, 0.5), (3, 1, 0.75)])
DG.out_degree(1, weight='weight') # 0.5
DG.degree(1, weight='weight') # 1.25
list(DG.successors(1)) # [2]
list(DG.neighbors(1)) # [2]
H = nx.Graph(G) # 有向图转为无向图
2.3 其他常见的图操作与图生成
经典图 、结构图(完整图、二分图、杠铃图等) 或随机图生成