Python NetworkX

2025年03月17日 | 阅读 9 分钟

在本教程中,让我们来探索 Python 的 NetworkX 库。NetworkX 在 Python 中表示网络分析。NetworkX 是一个 Python 模块,用于控制、创建和分析要素、结构和复杂网络元素。它用于创建、操作和研究复杂的图。

引言

NetworkX 是一个 Python 语言编程模块,用于研究复杂组织的要素结构和功能。它用于研究以节点和边表示的大型复杂网络。使用 NetworkX,我们可以加载和存储复杂的组织。我们可以生成许多随机和经典的网络,分析网络结构,构建网络模型,设计新的网络算法以及绘制网络。NetworkX 是在 BSD-new 许可证下发布的免费软件。

所需先决条件:对 Python 编程基础和数学图论的基本了解。

NetworkX 的亮点

  • 用于有向图和无向图的类。
  • 将图转换为多种格式以及从多种格式转换图。
  • 能够逐步构建随机图或创建它们。
  • 查找子图、圈和 k-中心的能力。
  • 研究邻近度、度、直径、半径、中心性、中介性等。
  • 以 2D 和 3D 绘制网络。

适用性

NetworkX 适用于处理大型真实世界图:例如,具有超过 200 亿个节点和 2000 亿条边的图。[需要澄清]。由于其对纯 Python“字典的字典”数据结构的依赖,NetworkX 是一个相对高效、完全可扩展、高度可组合的网络和社交网络分析框架。

安装

如果您的系统未安装 NetworkX 包,则需要立即安装。您可以使用下面的命令进行安装

上面的命令将在您的系统中安装 NetworkX 包。现在,您可以准备使用它了。有时,上面的命令可能会显示错误消息。您被告知使用 pip3 命令而不是 pip。这取决于您的系统如何配置。

导入库

您可以使用以下命令导入“networkx”模块

现在,可以使用别名“nxx”访问“networkx”模块。您可以使用任何别名;但是,“nxx”是 Python 中“networkx”模块最常用的别名。

使用 NetworkX Python 模块执行的各种操作

创建完全空的图

使用以下命令创建任何空图

上面的命令将创建一个空图。空图具有空的边集和空的顶点集。

要访问图 G1 的边集和顶点集,我们可以使用以下命令

G1.nodes() 和 G1.edges 都返回 Python 列表。G1.nodes() 和 G1.edges 将返回空列表,因为我们没有向图 G1 添加任何节点或边。

向图中添加节点

首先,我们将通过调用 Graph() 类来创建一个空图,如下所示。

NetworkX 中的节点可以是任何可哈希的对象,即数字、文本字符串、图像、XML 对象等。它也可以是 NetworkX 图。

有两种方法用于向图中添加节点。

add_node(): 此方法用于一次添加单个节点。

add_nodes_from(): 此方法接受列表、集合等可迭代容器,并一次添加多个节点。

源代码

输出

[1, 2, 3, 'node 5']

向图中添加边

这两个方法主要用于向图中添加边。边就像两个节点之间的连接。参数中指定的未知节点会自动添加到图中。

add_edges_from(): 此方法接受边元组的可迭代容器,如列表、迭代器等。

add_edge(): 此方法一次添加一条边。

NetworkX 会静默忽略将边或节点再次添加到图的操作。

源代码

输出

[1, 2, 3, 4, 5]
[(1, 2), (2, 3), (2, 4), (3, 5), (4, 5)]

从给定图中删除边和节点。

与添加边和节点类似,我们可以一次删除单条边和节点,也可以一次删除多条边和节点。

  • remove_node(): 此方法删除与该节点相关的所有边和节点。如果节点不在图中,将引发 NetworkXError。
  • remove_nodes_from(): 此方法接受可迭代容器,并从图中删除与这些节点相关的所有边和节点。如果图中不存在任何节点,它将静默处理,不做任何更改。
  • remove_edge(): 此方法从图中删除一条边,并保留节点。如果边不在图中,将引发 NetworkXError。
  • remove_edges_from(): 此方法接受可迭代容器,并从图中删除边。如果图中不存在任何边,它将静默处理,不做任何更改。

源代码

输出

[1, 2, 3, 4, 5, 6, 7, 8]
[(1, 2), (1, 4), (2, 3), (3, 4), (5, 6), (5, 7), (5, 8), (7, 8)]
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
[1, 2, 3, 4, 5, 6, 7, 8]
[(2, 3), (5, 6), (5, 7), (5, 8), (7, 8)]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - 
[1, 2, 3, 4, 6]
[(2, 3)]

访问图的元素

我们可以访问 NetworkX 图中的 4 个基本图属性。

  • nodes: 返回图中的节点列表。
  • edges: 返回图中的边列表。
  • adj: 为所有节点返回邻接列表。节点 X 的邻接列表包含直接连接到节点 X 的相邻节点。您可以使用下标表示法(使用 G.adj 后的方括号)访问节点的所有相邻节点。
  • degree: 返回图中连接到每个节点的节点数。您可以使用下标表示法(使用 G.degree 后的方括号)访问节点的度。

源代码

输出

Node - - - - - - - - - - - - - -- - - - - - -
[1, 2, 3, 5, 6]
Edge - - - - - - - - - - - - - - - - - - - - -
[(1, 2), (1, 3), (3, 5), (3, 6)]
Adjacency List- - - - - - - - - - - - - - - - - - - - -
{1: {2: {}, 3: {}}, 2: {1: {}}, 3: {1: {}, 5: {}, 6: {}}, 5: {3: {}}, 6: {3: {}}}
Degree- - - - - - - - - - - - - - - - - - - - -
[(1, 2), (2, 1), (3, 3), (5, 1), (6, 1)]
Adjacence Python List for node 3- - - - - - - - - - - - - -
{1: {}, 5: {}, 6: {}}
Degree for node 3- - - - - - -
3

图、节点和边的属性

每个图、节点和边都可以保存键/值属性对到一个相关的属性字典中。默认情况下,这些是空的。但是,可以使用 add_edge、add_node 或直接访问 G.graph、G.nodes 和 G.edges(对于图 G)的属性字典来添加或修改属性。

1. 图属性

您可以在创建图时使用 nxx.Graph() 分配属性。

源代码

输出

 {'graph_description': 'empty graph is created here'}

或者,您可以稍后像字典对象一样添加/修改属性

源代码

输出

 Output: {'description': 'This is empty graph', 'data': 5}

2. 节点属性

您可以使用 add_node()、add_nodes_from() 或 G.nodes 添加节点属性。您可以使用 G.nodes.data() 获取所有节点的属性。对于特定节点,使用下标表示法,如下所示。

源代码

输出

[(1, {'data': 'data11', 'type': 'root node'}), (2, {'node_type': 'children node', 'data': 'data22'}), (3, {'node_type': 'children node', 'data': 'data33'})]
 {'data': 'data11', 'type': 'root node'}

3. 边属性 - 创建带权重的边图

您可以使用 add_edge()、add_edges_from()、G.edges 或下标表示法为边添加属性。我们可以通过为边分配属性来创建带权重的图,如下所示。

源代码

输出

[(1, 2, {'weight_': 10}), (1, 3, {'weight_': 70}), (1, 4, {'weight_': 100}), (4, 5, {'weight_': 175})]

可视化 NetworkX 包的图

我们可以使用 draw() 方法绘制图并在 NetworkX 包中可视化它们,如下所示。

源代码

输出

Python NetworkX

NetworkX 图可视化

如果您想绘制带权重的图,请使用 draw_networkx_edge_labels(),并配合 nxx.draw() 指定图、pos 和 edge_label 参数。

源代码

输出

Python NetworkX

图:带权重的 NetworkX 图可视化

使用 NetworkX 包创建有向图

NetworkX 还允许您使用 DiGraph() 类创建有向图,该类提供额外的用于有向边的方法和属性,例如 DiGraph.out_edges、DiGraph.in_degree、DiGraph.predecessors()、DiGraph.successors() 等。

源代码

输出

Out edges of node 4 are: [(4, 5), (4, 6)]
In Degree of node 2 is: 2
Successors of node 4 are: [5, 6]
Predecessors of node 2 are: [1, 5]

Python NetworkX

图:NetworkX 有向图

结论

在本教程中,您了解了 NetworkX 包以及如何使用它来创建、操作和可视化图。这个库在研究复杂的组织和图时非常有用。数学家、物理学家、社会学家、计算机科学家等都使用它进行研究。

感谢阅读!!