📅  最后修改于: 2023-12-03 15:36:32.221000             🧑  作者: Mango
Networkx 是一个用于创建、操作和研究复杂网络的 Python 库。它可以用于处理多种类型的图,包括有向图、无向图、带权图、多重图等等。本文将以使用 Networkx 模块对图和特殊图进行操作为主题,介绍 Networkx 的基本用法和一些高级用法。
首先,我们需要安装 Networkx。可以使用 pip 来安装:
pip install networkx
接下来,我们可以使用 Networkx 来创建一个简单的无向图。以下是一个示例代码:
import networkx as nx
# 创建一个空图
G = nx.Graph()
# 添加节点
G.add_node(1)
G.add_node(2)
G.add_node(3)
# 添加边
G.add_edge(1, 2)
G.add_edge(2, 3)
# 绘制图形
nx.draw(G, with_labels=True)
这个代码创建了一个有三个节点和两条边的无向图,并绘制了出来。可以看到,节点 1 和节点 3 之间并没有边。
有向图的创建方式和无向图类似,可以使用 nx.DiGraph() 来创建一个有向图,使用 add_edge() 方法来添加有向边。
在 Networkx 中,我们可以很方便地获取到一个图的各种属性,例如节点数、边数、节点列表、边列表等等。
以下代码展示了如何获取图的节点数和边数:
import networkx as nx
# 创建一个图
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(2, 3)
# 获取节点数和边数
print("节点数: ", len(G.nodes))
print("边数: ", len(G.edges))
我们也可以使用 nx.nodes() 和 nx.edges() 方法来获取节点列表和边列表:
import networkx as nx
# 创建一个图
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(2, 3)
# 获取节点列表和边列表
print("节点列表: ", list(G.nodes))
print("边列表: ", list(G.edges))
除了基本的无向图和有向图,Networkx 还支持创建一些特殊类型的图。
例如,树是一种无向图,其中每个节点只有一个父节点,除了根节点没有父节点。我们可以使用 nx.random_tree() 来创建一个随机树,并绘制它:
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个随机树
G = nx.random_tree(10)
# 绘制图形
nx.draw(G, with_labels=True)
plt.show()
我们也可以使用 nx.balanced_tree() 来创建一棵平衡树,并绘制它:
import networkx as nx
import matplotlib.pyplot as plt
# 创建一棵平衡树,k 表示每个节点的度数为 k
G = nx.balanced_tree(3, 3)
# 绘制图形
nx.draw(G, with_labels=True)
plt.show()
另一个特殊的图是网格图。网格图是一个二维网格,其中每个节点都与上下左右四个节点相连。我们可以使用 nx.grid_2d_graph() 来创建一个 3x3 的网格图,并绘制它:
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个 3x3 的网格图
G = nx.grid_2d_graph(3, 3)
# 绘制图形
nx.draw(G, with_labels=True)
plt.show()
在 Networkx 中,还有一些更高级的用法,例如通过节点的度来筛选节点、计算图的连通性、计算最短路径等等。
以下代码展示了如何通过节点的度来筛选节点,并绘制出剩余的节点:
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个图
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (4, 1), (5, 1)])
# 筛选度数大于等于 2 的节点
nodes = [n for n, d in G.degree() if d >= 2]
# 创建一个子图并绘制它
H = G.subgraph(nodes)
nx.draw(H, with_labels=True)
plt.show()
我们也可以使用 nx.is_connected() 方法来判断一个无向图是否是连通图:
import networkx as nx
# 创建一个无向图
G = nx.Graph()
G.add_edges_from([(1, 2), (2, 3)])
# 判断是否是连通图
print(nx.is_connected(G))
最后,我们可以使用 nx.shortest_path() 方法计算两个节点之间的最短路径:
import networkx as nx
# 创建一个图
G = nx.Graph()
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (1, 5)])
# 计算最短路径
path = nx.shortest_path(G, source=1, target=5)
print(path)
以上就是使用 Networkx 模块对图和特殊图进行操作的介绍,希望对你有所帮助。