networkx学习记录

本文详细介绍了如何使用Python的NetworkX库创建和操作图形,包括创建图表、添加和删除节点与边、检查图的元素、使用图构造函数、访问边和邻居、向图元素添加属性,以及有向图的处理。此外,还展示了如何绘制图形并提供了多个示例代码。
摘要由CSDN通过智能技术生成

networkx学习记录

1. 创建图表

创建一个空图

import networkx as nx
G = nx.Graph()

此时如果报以下错误:
在这里插入图片描述则注意文件名不能是:networkx.py,修改文件名就好了。

2. 节点

图G的增长可以通过添加节点来实现

  • 添加节点方式一:添加一个节点,节点名为100(注意不是添加了100个节点)
G.add_node(100)
  • 添加节点方式二:
G.add_nodes_from([2, 3])
  • 添加节点方式三:合并其他图节点
H = nx.path_graph(10)
G.add_nodes_from(H)

G 现在包含 H 的节点作为 G 的节点(节点编号从0开始,到9结束)。
相比之下,您可以将图形 H用作G中的节点。

G.add_node(H)

图G现在包含H作为一个节点。图G现在包含H作为一个节点。 这种灵活性非常强大,因为它允许图形图形、文件图形、函数图形等等。

简单示例:
在这里插入图片描述

3. 边

也可以通过添加边来实现

  • 可以通过add_edge()一次添加一条边:指定的参数就是边所连接的两个节点
G.add_edge(1, 2)
  • 也可以通过元组的方式添加:
e = (2, 3)
G.add_edge(*e)  # unpack edge tuple*

简单示例:
在这里插入图片描述

  • 或者通过列表方式,同时添加多条边
G.add_edges_from([(1, 2), (1, 3)])

简单示例:注意看对比
在这里插入图片描述

  • 通过字符串添加
G.add_edges_from([(1, 2), (1, 3)])
G.add_node(1)
G.add_edge(1, 2)
G.add_node("spam")        # adds node "spam"
G.add_nodes_from("spam")  # adds 4 nodes: 's', 'p', 'a', 'm'
G.add_edge(3, 'm')

在这里插入图片描述

补充:G.clear()会清除所有节点和边
在这里插入图片描述

4.检查图的元素

G.number_of_nodes():图G中结点的数量
G.number_of_edges():图G中边的数量
G.nodes():图G中的节点的情况
G.edges():图G中边的情况
G.adj():某一结点的邻接节点情况
G.degree():节点的度
在这里插入图片描述
G.edges()、G.degree()可以添加参数,具体的示例如下:

print(G.edges([1, 'm']))
print(G.degree([1, 'm']))

5.从图中删除元素

可以以与添加类似的方式从图中删除节点和边。
使用方法:Graph.remove_node(),Graph.remove_nodes_from(),Graph.remove_edge()和Graph.remove_edges_from(),例如:

G.remove_node(2)
G.remove_nodes_from("spam")
list(G.nodes)
G.remove_edge(1, 3)

6.使用图构造函数

图形对象不必增量构建 - 数据指定图结构可以直接传递给各种构造函数图类。
通过实例化其中一个图来创建图结构时类,可以指定多种格式的数据。

import networkx as nx

G = nx.Graph()
G.add_edge(1, 2)
H = nx.DiGraph(G)  # create a DiGraph using the connections from G
print("edges:",list(H.edges()))
edgelist = [(0, 1), (1, 2), (2, 3)]
H = nx.Graph(edgelist)  # create a graph from an edge list
print("edges:",list(H.edges()))
adjacency_dict = {0: (1, 2), 1: (0, 2), 2: (0, 1)}
H = nx.Graph(adjacency_dict)  # create a Graph dict mapping nodes to nbrs
print("edges:",list(H.edges()))

在这里插入图片描述

7.访问边和邻居

除了视图G.edges和G.adj,使用下标符号可以访问边和邻居:

G = nx.Graph([(1, 2, {"color": "yellow"})])
G[1]  # same as G.adj[1]
G[1][2]
G.edges[1, 2]

在这里插入图片描述
如果边存在,还可以使用下标符号获取/设置边的属性:

G.add_edge(1, 3)
G[1][3]['color'] = "blue"
G.edges[1, 2]['color'] = "red"
G.edges[1, 2]

所有(节点,邻接)对的快速检查是使用G.adjacency() G.adj.items()。请注意,对于无向图,邻接迭代会看到每条边两次。

G = nx.Graph()
G.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in G.adj.items():
    for nbr, eattr in nbrs.items():
        wt = eattr['weight']
        if wt < 0.5: print(f"({n}, {nbr}, {wt:.3})")

在这里插入图片描述
使用 edge 属性可以方便地访问所有边:


G = nx.Graph()
G.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in G.adj.items():
    for nbr, eattr in nbrs.items():
        wt = eattr['weight']
        # if wt < 0.5: print(f"({n}, {nbr}, {wt:.3})")
for (u, v, wt) in G.edges.data('weight'):
    if wt < 0.5:
        print(f"({u}, {v}, {wt:.3})")

在这里插入图片描述

8.向图、节点和边添加属性

诸如权重、标签、颜色或任何您喜欢的 Python 对象之类的属性,可以附加到图、节点或边。

每个图、节点和边都可以在关联的属性字典(键必须是可散列的)。 默认情况下,这些是空的,但是可以使用 add_edge、add_node 或直接添加或更改属性操作名为“G.graph”、“G.nodes”和图形“G”的“G.edges”。

  • 图形属性
    创建新图形时分配图形属性:
G = nx.Graph(day="Friday")
G.graph

修改属性:

G.graph['day'] = "Monday"
G.graph
  • 节点属性
    使用 add_node()、add_nodes_from() 或 G.nodes 添加节点属性:
G.add_node(1, time='5pm')
G.add_nodes_from([3], time='2pm')
G.nodes[1]
G.nodes[1]['room'] = 714
G.nodes.data()

在这里插入图片描述

注意:请注意,将节点添加到 G.nodes 不会将其添加到图形中,请使用G.add_node() 添加新节点。 缘也是如此。

  • 边缘属性
    使用 add_edge()、add_edges_from() 或下标符号添加/更改边属性:
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})])
G[1][2]['weight'] = 4.7
G.edges[3, 4]['weight'] = 4.2

特殊属性 weight 应该是数字,因为它被使用需要加权边的算法。

9.有向图

DiGraph 类提供特定的附加方法和属性到有向边,例如:DiGraph.out_edges、DiGraph.in_degree、DiGraph.predecessors、DiGraph.successors 等。
为了让算法能够轻松地处理这两个类,有向版本的neighbors 等价于successors, degree 等价于in_degree 和 out_degree 。

DG = nx.DiGraph()
DG.add_weighted_edges_from([(1, 2, 0.5), (3, 1, 0.75)])
DG.out_degree(1, weight='weight')
DG.degree(1, weight='weight')
print(list(DG.successors(3)))
print(list(DG.neighbors(1)))

在这里插入图片描述

10. 绘制图形

G = nx.petersen_graph()
subax1 = plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
subax2 = plt.subplot(122)
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='normal')

plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值