一个用于复杂网络,图结构的搭建,操作,与研究的python库。由于通常在python中这样导入:
import networkx as nx
所以下文简称networkx为nx。
nx支持以下几种图结构类型
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
#(多重有向图,允许任意两个节点之间有多条有向边)
如果尝试输出任意图的类型,你可以发现它是一个对象。
但是当你给这个图加入属性后,它就被dict然后添加到属性“graph”中,这是非常pythonic的事情,方便我们处理事务逻辑及编写代码。
同样,和普通的字典一样,nx支持任意数据类型作为属性值。
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的边,节点,都具有一样的特性。
nx中添加节点可以是任意的可迭代对象,也可以单个添加:
G.add_node(1, name="van", age=3)
G.add_nodes_from([2,3])
如果想访问节点可以使用:
nodes = G.nodes(data=True)
data=True表示同时返回属性值。
同理,对于边的操作也如上:
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)
如果你想访问边中的某一个属性,可以这样:
由于nx存储图的逻辑结构本质上是领接表结构,所以你可以这样遍历节点:
for n in G:
print(n)
output:
1
2
3
4
5
或者遍历每个节点近邻以及两者之间的边属性:
for n,nbrs in G.adjacency():
for nbr,eattr in nbrs.items():
print(n,nbr,eattr)
output:
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'}
如果他们是多重图,这将允许两个节点之间拥有多条边,也允许拥有多条属性一样的边:
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:
1 2 {0: {'relation': 'friend'}, 1: {'relation': 'neighbor'}, 2: {'relation': 'friend'}}
2 1 {0: {'relation': 'friend'}, 1: {'relation': 'neighbor'}, 2: {'relation': 'friend'}}
可以看到对于同一边之间的的不同属性,nx默认给了key去映射,所以我们需要遍历属性时,可以如下操作:
for key in G[1][2]:
print(G[1][2][key])
output:
{'relation': 'friend'}
{'relation': 'neighbor'}
{'relation': 'friend'}
nx中还可以导入matplotlib去进行图结构的绘制,这里给出一个简单的模版,不再赘述
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 删除。