Networkx
是python常用的处理图模型的工具包,可以方便的处理图模型:
-
Github项目主页:https://github.com/networkx/networkx
-
官网基本教程:https://networkx.org/documentation/stable/tutorial.html
-
Networkx
文档:https://pelegm-networkx.readthedocs.io/en/latest/ -
Networkx v2.5
中文文档:https://www.osgeo.cn/networkx/tutorial.html
下面是Networkx
中对图的一些基本操作,包括:
- 节点、边的增删改查
- 节点属性、边属性的增删改查
- 图基本信息
- 图遍历
- 邻接图、邻接表
import matplotlib.pyplot as plt
import networkx as nx # 导入包
import numpy as np
def generate_network():
"""构建图的操作"""
# 构建一个图,包括三个群落,分别包裹5,12,13个节点
gen_network: nx.Graph = nx.generators.community.random_partition_graph([5, 12, 13], .25, .1, seed=0)
# 更多生成图的操作可以参考:https://networkx.org/documentation/stable/reference/generators.html
# 增
gen_network.add_node(1, feature_1='a', feature_2='b') # 为节点1添加2个特征
gen_network.add_node(31, feature_1='c') # 添加节点31并增加1个特征
gen_network.add_edge(1, 31) # 增加1条边:1-31
gen_network.add_edges_from([(2, 31), (3, 31)]) # 批量增加多个边
# 删
# gen_network.remove_node(10) # 删除单个节点
# gen_network.remove_nodes_from([11, 13]) # 删除多个节点
# gen_network.remove_edge(2, 31) # 删除单条边
# gen_network.remove_edges_from([(3, 31)]) # 删除多条边
# 改(一般是点、边的属性)
gen_network.nodes[1].update({"feature_1": "A", "feature_2": "B"})
# 绘制图像
nx.draw_networkx(gen_network, with_labels=True)
plt.show()
return gen_network
if __name__ == '__main__':
graph = generate_network()
print("===============================================================")
# networkx图基本信息
print("图的基本信息", nx.info(graph))
print("点的数量:", graph.number_of_nodes())
print("边的数量:", graph.number_of_edges())
print("图的直径:", nx.diameter(graph))
print("图的平均最短路径:", nx.average_shortest_path_length(graph))
print("===============================================================")
# 节点基本信息
print("所有节点信息:", graph.nodes(data=True)) # 每个节点都有一个id,用于标识节点
print("所有边的信息:", graph.edges(data=True)) # 每个边是用两个节点的id表示,networkx不允许出现平行边(两个节点多条边)
print("节点id为0的属性:", graph.nodes[1])
print("节点id为1的度:", graph.degree[3])
print("节点id为1的邻居:", list(graph.neighbors(1)))
# np.array(nx.adjacency_matrix(G).todense()) # 邻接矩阵
# 全图信息
print("图遍历:", list(graph.adjacency()))
print("包含属性feature_1的全部节点", nx.get_node_attributes(graph, "feature_1"))
print("邻接图见下方程序\n")
adjacency_graph_1 = np.array(nx.adjacency_matrix(graph).todense())
adjacency_graph_2 = np.array(nx.to_numpy_matrix(graph))
print("邻接表见下方程序")
adjacency_table = list(nx.generate_adjlist(graph))
print("===============================================================")
更多参考
- Python包 - networkx:https://blog.51cto.com/u_15127570/4267453
- networkx完全指南1:[https://www.yanxishe.com/columnDetail/19083](