NetworkX-复杂网络分析

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 其他常见的图操作与图生成

图的子集、合并、补集、笛卡尔积、类型转换

经典图结构图(完整图、二分图、杠铃图等)随机图生成

往年同期文章