Python中图结构的操作-NetworkX介绍

  • A+
所属分类:Python库介绍
摘要这一篇主要介绍使用Python处理网络相关的数据的库, NetworkX.

简介

最近在看GCN的内容, 里面会用到关于一些网络结构. 在处理数据的时候就会使用到NetworkX这个库, 在这里简单介绍一下相关的内容. 自己也是用到多少就记录多少, 会不断进行补充的.

参考资料

这个是NetworkX的说明文档, NetworkX, Software for Complex Networks

 

图的一些操作

关于这部分的内容, 可以参考连接, NetworkX, Tutorial

创建一个图

我们首先创建一个空的图, 没有nodes和edges.

  1. import networkx as nx
  2. G = nx.Graph()

 

添加节点与添加边

接着我们向上面的图中添加node和edge. 一般情况下, 我们会首先将所有的node都添加完毕, 之后再添加edge. 添加node有下面两种方法.

我们可以一次只添加一个点.

  1. G.add_node(1)

也可以一次添加多个点.

  1. G.add_nodes_from([2, 3])

当然, 我们在添加节点的时候, 可以一起添加节点的属性值.

  1. G.add_nodes_from([
  2.     (4, {"color": "red"}),
  3.     (5, {"color": "green"}),
  4. ])

在添加完节点之后, 我们需要添加边. 同样的, 我们可以一条一条边进行添加.

  1. G.add_edge(1, 2)

我们也可以多条边一起添加, 同时可以加上权重.

  1. G.add_edges_from([(2, 3, {'weight': 3.1415}), (4, 5), (3, 5)])

 

顶点和边的信息

对于一个network来说, 我没可以查询他的点的个数和边的个数.

  1. numNodes = G.number_of_nodes()
  2. numEdges = G.number_of_edges()

除了列举顶点和边的个数以外, 我们还可以列举出具体的顶点和具体的边的信息.

  1. list(G.nodes)
  2. """
  3. [1, 2, 3, 4, 5]
  4. """
  5. list(G.edges)
  6. """
  7. [(1, 2), (2, 3), (3, 5), (4, 5)]
  8. """

 

判断node与node之间是否有边

有的时候, 我们需要判断两个node之间是否是相连的, 这个时候就需要是要is_path函数. 例如在上面node 2和node 3是相连的, 但是node 2和node 4是不相连的, 我们可以确认一下.

  1. nx.is_path(G, (2,3))
  2. # >> True
  3. nx.is_path(G, (2,4))
  4. # >> False

 

图的可视化

我们可以使用nx.draw来进行网络的可视化. 所有的参数都可以自定义在options中.

  1. import matplotlib.pyplot as plt
  2. options = {
  3.     'with_labels': True,
  4.     'font_weight': 'bold',
  5.     'node_color': 'blue',
  6.     'node_size': 300,
  7.     'width': 3,
  8. }
  9. nx.draw(G, **options)
  10. plt.show()

最终的结果显示如下图所示:

Python中图结构的操作-NetworkX介绍

 

读取和保存文件

这部分内容可以参考链接, NetworkX, Reading and writing graphs

读取邻接矩阵-Adjacency List

对于edge没有权重的图来说, 可以使用adjacency lists的方式来进行读取. 他读取的格式如下所示:

  1. a b c # source target target
  2. d e

其中每一行第一个字母是source node, 后面是target node. 也就是上面的格式表示的图为 a-b, a-c, d-e, 包含三条边. 我们可以通过read_adjlist来进行文件的读取, 如下所示:

  1. G = nx.read_adjlist("test.adjlist")

参考资料:

NetworkX关于Adjacency List的相关说明, Adjacency List.

 

保存为Adjacency List

我们可以直接使用write_adjlist来完成相关的操作. 如下所示:

  1. fh = open("test.adjlist", "wb")
  2. nx.write_adjlist(G, fh, comments='#@')

此时, 最终的输出结果如下所示:

  1. #@dataPre.py
  2. #@ GMT Thu Sep 10 18:41:01 2020
  3. #@
  4. 1 2
  5. 2 3
  6. 3 5
  7. 4 5
  8. 5

这里每一行的含义和上面读取的时候是一样的. 这里最上面是会有一些信息的, 例如运行的时间和文件的名字.

但是如果想要去掉最上面的一些信息, 或是自定义信息的内容, 我们可以重新写一下相关的函数. 例如此时文件开头就是整个图的顶点个数和边的个数.

  1. def writeAdj(subG, adjPath):
  2.     """写入文件
  3.     """
  4.     fh = open(adjPath, "wb")
  5.     numNodes = subG.number_of_nodes()
  6.     numEdges = subG.number_of_edges()
  7.     # 开始写入
  8.     fh.write(('{} {}\n'.format(numNodes, numEdges)).encode('utf-8'))
  9.     for line in nx.generate_adjlist(subG, " "):
  10.         line += "\n"
  11.         fh.write(line.encode('utf-8'))

此时输出的文件如下, 第一行5表示5个顶点, 4表示有4条边. 第二行开始, 1表示source node, 2表示target node. 此时就是表示node 1和node 2是相连的.

  1. 5 4
  2. 1 2
  3. 2 3
  4. 3 5
  5. 4 5
  6. 5

 

转换为其他数据类型

与其他数据类型的转换, 可以参考链接: NextworkX converting to and from other data formats

转换为pandas的格式

将图的邻接矩阵使用dataframe来进行表示.

  1. nx.to_pandas_adjacency(G)

最终的输出结果如下所示, 可以看到上面有设置权重是3.1415的边.

Python中图结构的操作-NetworkX介绍

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: