前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一点networkx的使用技巧

一点networkx的使用技巧

原创
作者头像
从不摸鱼的van
修改2023-10-09 14:31:58
4400
修改2023-10-09 14:31:58
举报
文章被收录于专栏:杂七杂八

由于工作中的某个需求,深入了解了一下networkx这个python库,发现很多资料国内都不全面,故而自我整理这些天的一些使用到的方法,如有任何问题,欢迎评论交流。


1.什么是networkx?

一个用于复杂网络图结构的搭建,操作,与研究的python库。由于通常在python中这样导入:

代码语言:python
代码运行次数:0
复制
import networkx as nx

所以下文简称networkx为nx。

2.nx中的图类型

nx支持以下几种图结构类型

代码语言:python
代码运行次数:0
复制
nx.Graph() #undirected graph(无向图)
nx.DiGraph() #directed graph(有向图)
nx.MultiGraph() #allows multiple edges between any pair of nodes
                #(多重无向图,允许任意两个节点之间有多条边)
nx.MultiDiGraph() #allows multiple directed edges between any pair of nodes
                #(多重有向图,允许任意两个节点之间有多条有向边)

3.nx的字典化

如果尝试输出任意图的类型,你可以发现它是一个对象。

这能清楚的显示出它是一个Graph类
这能清楚的显示出它是一个Graph类

但是当你给这个图加入属性后,它就被dict然后添加到属性“graph”中,这是非常pythonic的事情,方便我们处理事务逻辑及编写代码。

同样,和普通的字典一样,nx支持任意数据类型作为属性值。

代码语言:python
代码运行次数:0
复制
G = nx.Graph(description=(1,2,3),title="graph") 
G = nx.Graph(description={"name":"van","age":3})
G = nx.Graph(description=[1,2,3,{"name":"van","age":3}])

同时,nx的边,节点,都具有一样的特性。

4.nx中添加节点,边

nx中添加节点可以是任意的可迭代对象,也可以单个添加:

代码语言:python
代码运行次数:0
复制
G.add_node(1, name="van", age=3)
G.add_nodes_from([2,3])

如果想访问节点可以使用:

代码语言:python
代码运行次数:0
复制
nodes = G.nodes(data=True)

data=True表示同时返回属性值。

同理,对于边的操作也如上:

代码语言:javascript
复制
G.add_edge(1,2,weight=4.7)
G.add_edges_from([(3,4),(4,5)],color='red')
G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
edges = G.edges(data=True)

如果你想访问边中的某一个属性,可以这样:

使用node作为key访问到边,再使用属性名称作为关键字访问到具体的值
使用node作为key访问到边,再使用属性名称作为关键字访问到具体的值

由于nx存储图的逻辑结构本质上是领接表结构,所以你可以这样遍历节点:

代码语言:javascript
复制
for n in G:
    print(n)

output:

代码语言:python
代码运行次数:0
复制
1
2
3
4
5

或者遍历每个节点近邻以及两者之间的边属性:

代码语言:python
代码运行次数:0
复制
for n,nbrs in G.adjacency():
    for nbr,eattr in nbrs.items():
        print(n,nbr,eattr)

output:

代码语言:python
代码运行次数:0
复制
1 2 {'weight': 4.7, 'color': 'blue'}
2 1 {'weight': 4.7, 'color': 'blue'}
2 3 {'weight': 8}
3 4 {'color': 'red'}
3 2 {'weight': 8}
4 3 {'color': 'red'}
4 5 {'color': 'red'}
5 4 {'color': 'red'}

5.多重图

如果他们是多重图,这将允许两个节点之间拥有多条边,也允许拥有多条属性一样的边:

代码语言:python
代码运行次数:0
复制
G = nx.MultiGraph()
G.add_edge(1,2,relation='friend')
G.add_edge(1,2,relation='neighbor')
G.add_edge(1,2,relation='friend')
for n,nbrs in G.adjacency():
    for nbr,eattr in nbrs.items():
        print(n,nbr,eattr)

output:

代码语言:python
代码运行次数:0
复制
1 2 {0: {'relation': 'friend'}, 1: {'relation': 'neighbor'}, 2: {'relation': 'friend'}}
2 1 {0: {'relation': 'friend'}, 1: {'relation': 'neighbor'}, 2: {'relation': 'friend'}}

可以看到对于同一边之间的的不同属性,nx默认给了key去映射,所以我们需要遍历属性时,可以如下操作:

代码语言:python
代码运行次数:0
复制
for key in G[1][2]:
    print(G[1][2][key])

output:

代码语言:javascript
复制
{'relation': 'friend'}
{'relation': 'neighbor'}
{'relation': 'friend'}

6.绘图

nx中还可以导入matplotlib去进行图结构的绘制,这里给出一个简单的模版,不再赘述

代码语言:javascript
复制
import matplotlib.pyplot as plt
pos = nx.spring_layout(G)
edge_labels = {(node1, node2): data['color'] for node1, node2, data in G.edges(data=True)}
nx.draw(G, pos, with_labels=True, node_size=500, node_color='lightblue', font_size=10, font_color='black')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10)
plt.show()

里面许多属性可以自定义
里面许多属性可以自定义

关于更多详细资料,大家可以参考nx官网进行探索:https://networkx.org/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 由于工作中的某个需求,深入了解了一下networkx这个python库,发现很多资料国内都不全面,故而自我整理这些天的一些使用到的方法,如有任何问题,欢迎评论交流。
  • 1.什么是networkx?
  • 2.nx中的图类型
  • 3.nx的字典化
  • 4.nx中添加节点,边
  • 5.多重图
  • 6.绘图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档