查看原文
其他

networkx,一个超强的 python 库

程序员小寒 程序员学长 2023-09-28

大家好,我是小寒。

今天给大家分享一个超强的 python 库,networkx

https://github.com/networkx/networkx

NetworkX 用于创建、操作和研究复杂网络的结构、动态和功能

它提供了一个简单而灵活的API来构建图并执行各种与图相关的操作。

什么是图

图是由节点(也称为顶点)和边组成的数据结构。节点表示图中的实体,边表示实体之间的关系或连接
图可用于对各种现实世界问题进行建模,例如社交网络、交通系统和计算机网络等。
有向图是边有方向的图。这意味着边仅沿特定方向从一个节点到达另一个节点

相反,无向图没有方向,边可以以任何方向从一个节点到另一个节点

最后,多重图是在相同的两个节点之间可以具有多条边的图。

初体验

库的安装

可以使用 pip 来安装 NetworkX。
pip install networkx

安装完 NetworkX 后,你就可以开始在 Jupyter Notebook 中使用它。

首先,你需要导入 networkx 和 matplotlib 包,它们用于绘制和可视化图形。
下面是如何使用 NetworkX 创建简单图形,并使用 matplotlib 绘制它的示例。

示例

在此示例中,我们首先使用 import 语句导入 networkx 和 matplotlib 包。
然后,我们使用 NetworkX 的 Graph 类创建一个空图。
我们使用 add_node() 函数添加 ID 为 1 和 2 的两个节点,并使用 add_edge() 函数在它们之间添加一条边。
最后,我们使用 NetworkX 的 draw() 函数绘制带有标签的图形,并使用 matplotlib 的 show() 函数实际显示它。
正如你所看到的,Graph 创建了一个无向图。
import random
import networkx as nx

G = nx.Graph()
G.add_node('1')
G.add_node('2')
G.add_edge('1','2')
nx.draw(G,with_labels=True)

当然,networkx 的主要目的不是绘制如此简单的图表。相反,networkx 的真正强大之处在于分析图表

例如,我们可以轻松找到两个给定节点之间的最短路径

为了说明这一点,我们将创建一个更大的随机图表
# Create a random graph of 100 nodes:

num_nodes = 100

G = nx.Graph()
G.add_nodes_from(range(num_nodes))

# Give each node an edge to two other nodes, randomly chosen
for i in range(num_nodes):
    G.add_edge(i, random.randint(0, num_nodes-1))
    G.add_edge(i, random.randint(0, num_nodes-1))

# We are looking for the shortest distance from node 0 to node 99.
# Paint node 0 red and node 99 green.

color_map = ["gray"] * num_nodes
color_map[0] = "red"
color_map[-1] = "green"
    
nx.draw(G, node_color=color_map, with_labels=True)

此代码示例创建了一个包含 100 个节点和节点之间的边的随机图。

它使用 Python 标准库中的 random 模块,通过随机选择两个节点来添加边。
然后,根据节点是起始节点(红色)还是结束节点(绿色)来分配节点的颜色。这是通过创建 color_map 列表来完成的,其中每个元素对应于图中的一个节点。color_map 列表的第一个元素设置为“red”,对应于起始节点,最后一个元素设置为“green”,对应于结束节点。

最后,NetworkX 的 draw() 函数用于绘制具有指定颜色的图形。node_color 参数设置为 color_map 列表,它将每个节点映射到其相应的颜色。

接下来,我们计算红色节点和绿色节点之间的最短路径。

示例中创建的随机图中的起始(红色)和结束(绿色)节点之间的最短路径是使用 NetworkX 的 Shortest_path() 函数计算的。

该函数将图以及起始节点和结束节点的 ID 作为输入。结果存储在变量 path 中,它形成两个节点之间最短路径的节点列表

path=nx.shortest_path(G,source=0, target=99)

让我们将最短路径涂成红色,即最短路径上的所有边都应涂成红色,所有其他边涂成黑色。

edges_on_path = [(path[i], path[i+1]) for i in range(len(path)-1)]
edge_colors = []
for edge in G.edges:
    if edge in edges_on_path \
            or tuple(reversed(edge)) in edges_on_path:
        edge_colors.append("red")
    else:
        edge_colors.append("black")
        
nx.draw_spring(G, node_color=color_map, edge_color=edge_colors, with_labels=True)

最短路径上的边存储在 edges_on_path 列表中。

这是通过迭代 path 列表中的节点并将相邻节点之间的边添加到 edges_on_path 列表中来完成的。
然后,根据边是否在最短路径上创建 edge_colors 列表。如果边缘位于最短路径上,则其颜色设置为“红色”。否则,其颜色设置为 “黑色”。
最后,NetworkX 的 draw_spring() 函数用于绘制具有指定节点和边颜色的图形。node_color 参数设置为 color_map 列表,该列表将每个节点映射到其相应的颜色。将 edge_color 参数设置为 edge_colors 列表,该列表将每条边映射到其相应的颜色。


通过使用 Python 中的 networkx 库,你可以轻松创建和分析复杂图,包括有向图和无向图、多重图等。


最后



今天的分享就到这里。如果觉得不错,点赞,转发安排起来吧。接下来我们会分享更多的 「深度学习案例以及python相关的技术」,欢迎大家关注。最后,最近新建了一个 python 学习交流群,会经常分享 「python相关学习资料,也可以问问题,非常棒的一个群」

「进群方式:加我微信,备注 “python”」



往期回顾


Fashion-MNIST 服装图片分类-Pytorch实现

python 探索性数据分析(EDA)案例分享

深度学习案例分享 | 房价预测 - PyTorch 实现

万字长文 |  面试高频算法题之动态规划系列

面试高频算法题之回溯算法(全文六千字)  

    



如果对本文有疑问可以加作者微信直接交流。进技术交流群的可以加微信拉你进群。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存