📜  使用 Networkx 模块对图和特殊图进行操作 | Python(1)

📅  最后修改于: 2023-12-03 15:36:32.221000             🧑  作者: Mango

使用 Networkx 模块对图和特殊图进行操作 | Python

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 模块对图和特殊图进行操作的介绍,希望对你有所帮助。