用Python将原始边列表转换为邻接矩阵

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

在图论和网络分析中,图是一种非常重要的数据结构,它由节点(或顶点)和连接这些节点的边组成。在Python中,我们可以使用邻接矩阵来表示图,其中矩阵的行和列代表节点,矩阵中的值表示节点之间是否存在边。

有时候,我们会从外部数据源中得到原始的边列表,而需要将其转换为邻接矩阵以便进行后续的分析和处理。本文将介绍如何使用Python来实现这一转换过程。

原始边列表

假设我们有一个原始边列表,其中每个元素都表示一条边,例如:

edges = [(0, 1), (0, 2), (1, 2), (2, 3)]

在这个例子中,每个元组 (a, b) 表示节点 a 和节点 b 之间存在一条边。

转换为邻接矩阵

我们首先需要确定图中节点的数量,然后创建一个相应大小的零矩阵。接着,我们遍历原始边列表,根据每条边的两个节点,将对应的矩阵元素设为 1。最终得到的矩阵就是我们所需的邻接矩阵。

让我们来看看如何用Python代码实现这一过程:

def edges_to_adjacency_matrix(edges):
    # 找到图中节点的数量
    max_node = max(max(edge) for edge in edges) + 1
    
    # 创建零矩阵
    adjacency_matrix = [[0] * max_node for _ in range(max_node)]
    
    # 遍历原始边列表,更新邻接矩阵
    for edge in edges:
        adjacency_matrix[edge[0]][edge[1]] = 1
        adjacency_matrix[edge[1]][edge[0]] = 1  # 如果是无向图,边是双向的
    
    return adjacency_matrix

# 测试
edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edges_to_adjacency_matrix(edges)
for row in adjacency_matrix:
    print(row)

在这段代码中,edges_to_adjacency_matrix 函数接受原始边列表作为参数,并返回对应的邻接矩阵。然后我们对给定的边列表进行了测试,并输出了生成的邻接矩阵。

扩展和优化

虽然上述代码能够完成原始边列表到邻接矩阵的转换,但在实际应用中可能需要进行一些扩展和优化。

  1. 处理有向图和无向图:目前的代码默认处理无向图,如果是有向图,需要根据具体需求修改代码,只在一个方向上设置邻接关系。

  2. 处理权重:有时边不仅仅是存在与否的关系,还可能有权重。修改代码以支持带权重的图。

  3. 使用稀疏矩阵:对于大型图,邻接矩阵可能会占用大量内存,可以考虑使用稀疏矩阵来节省内存空间。

  4. 性能优化:对于大规模的边列表,需要考虑代码的性能。可以尝试使用更高效的数据结构或算法来实现转换过程。

下面是对代码的一些优化示例:

import numpy as np

def edges_to_adjacency_matrix(edges, directed=False):
    max_node = max(max(edge) for edge in edges) + 1
    adjacency_matrix = np.zeros((max_node, max_node))
    for edge in edges:
        if directed:
            adjacency_matrix[edge[0]][edge[1]] = 1
        else:
            adjacency_matrix[edge[0]][edge[1]] = 1
            adjacency_matrix[edge[1]][edge[0]] = 1
    return adjacency_matrix

# 测试
edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edges_to_adjacency_matrix(edges)
print("无向图的邻接矩阵:")
print(adjacency_matrix)

directed_edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
directed_adjacency_matrix = edges_to_adjacency_matrix(directed_edges, directed=True)
print("\n有向图的邻接矩阵:")
print(directed_adjacency_matrix)

在优化后的代码中,我们使用了NumPy库来创建和操作矩阵,这可以提高代码的性能和可读性。同时,我们添加了一个参数 directed 来指示图的类型,从而支持有向图和无向图的转换。

使用稀疏矩阵优化内存占用

在处理大型图时,邻接矩阵可能会变得非常稀疏,其中大部分元素都是零。为了优化内存占用,可以使用稀疏矩阵来表示邻接关系。

Python中有多种库可以处理稀疏矩阵,其中Scipy库提供了稀疏矩阵的各种操作和算法。让我们来看看如何使用Scipy中的稀疏矩阵来优化代码:

import numpy as np
from scipy.sparse import lil_matrix

def edges_to_adjacency_matrix(edges, directed=False):
    max_node = max(max(edge) for edge in edges) + 1
    adjacency_matrix = lil_matrix((max_node, max_node), dtype=np.int8)
    for edge in edges:
        if directed:
            adjacency_matrix[edge[0], edge[1]] = 1
        else:
            adjacency_matrix[edge[0], edge[1]] = 1
            adjacency_matrix[edge[1], edge[0]] = 1
    return adjacency_matrix

# 测试
edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edges_to_adjacency_matrix(edges)
print("无向图的邻接矩阵:")
print(adjacency_matrix.toarray())

directed_edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
directed_adjacency_matrix = edges_to_adjacency_matrix(directed_edges, directed=True)
print("\n有向图的邻接矩阵:")
print(directed_adjacency_matrix.toarray())

在这个版本的代码中,我们使用了 scipy.sparse.lil_matrix 来创建稀疏矩阵。它能够有效地处理大型稀疏矩阵,并且只存储非零元素,从而节省内存。

通过这种优化,我们可以处理更大规模的图数据,而不会因为内存占用过高而导致性能下降或内存不足的问题。

处理带权重的边列表

在某些情况下,图的边不仅仅表示节点之间的连接关系,还可能有权重信息。例如,在交通网络中,边可以表示道路,而权重可以表示道路的长度或通行时间。

让我们来看看如何修改代码,以支持带权重的边列表:

import numpy as np
from scipy.sparse import lil_matrix

def edges_to_adjacency_matrix(edges, directed=False, weighted=False):
    max_node = max(max(edge[0], edge[1]) for edge in edges) + 1
    adjacency_matrix = lil_matrix((max_node, max_node), dtype=np.float32)
    for edge in edges:
        if directed:
            if weighted:
                adjacency_matrix[edge[0], edge[1]] = edge[2]
            else:
                adjacency_matrix[edge[0], edge[1]] = 1
        else:
            if weighted:
                adjacency_matrix[edge[0], edge[1]] = edge[2]
                adjacency_matrix[edge[1], edge[0]] = edge[2]
            else:
                adjacency_matrix[edge[0], edge[1]] = 1
                adjacency_matrix[edge[1], edge[0]] = 1
    return adjacency_matrix

# 测试
weighted_edges = [(0, 1, 5), (0, 2, 3), (1, 2, 2), (2, 3, 7)]
weighted_adjacency_matrix = edges_to_adjacency_matrix(weighted_edges, weighted=True)
print("带权重的邻接矩阵:")
print(weighted_adjacency_matrix.toarray())

在这个版本的代码中,我们添加了一个 weighted 参数来指示边是否带有权重。如果 weighted 参数为 True,则从边列表中提取权重信息,并将其保存到邻接矩阵中。否则,邻接矩阵中的值仍然表示边的存在与否。

通过这种修改,我们可以处理带有权重信息的图数据,并在邻接矩阵中保留这些信息,以便进行后续的分析和计算。

图的可视化

在处理图数据时,可视化是一种强大的工具,它可以帮助我们直观地理解图的结构和特征。Python中有许多库可以用来可视化图数据,其中NetworkX是一个常用的库,它提供了丰富的功能来创建、操作和可视化图。

让我们来看看如何使用NetworkX来可视化我们生成的邻接矩阵:

import networkx as nx
import matplotlib.pyplot as plt

def visualize_adjacency_matrix(adjacency_matrix):
    G = nx.from_numpy_matrix(adjacency_matrix)
    pos = nx.spring_layout(G)  # 定义节点位置
    nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=500, font_size=10)  # 绘制图
    edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)}  # 获取边权重
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10)  # 绘制边权重
    plt.title("Graph Visualization")
    plt.show()

# 测试
weighted_edges = [(0, 1, 5), (0, 2, 3), (1, 2, 2), (2, 3, 7)]
weighted_adjacency_matrix = edges_to_adjacency_matrix(weighted_edges, weighted=True)
print("带权重的邻接矩阵:")
print(weighted_adjacency_matrix.toarray())

visualize_adjacency_matrix(weighted_adjacency_matrix.toarray())

在这段代码中,我们首先使用NetworkX的 from_numpy_matrix 函数将邻接矩阵转换为图对象。然后使用 spring_layout 定义节点的位置,并使用 draw 函数绘制图。最后,我们使用 draw_networkx_edge_labels 函数绘制边的权重。

通过可视化,我们可以清晰地看到图的结构,并直观地了解节点之间的连接关系和权重信息。

邻接矩阵转换为原始边列表

在图数据处理中,有时候我们需要将邻接矩阵转换回原始的边列表形式。这在某些算法和应用中可能很有用,因为一些算法可能更适合使用边列表来表示图。

让我们看看如何编写代码来实现这一转换:

import numpy as np

def adjacency_matrix_to_edges(adjacency_matrix):
    edges = []
    for i in range(adjacency_matrix.shape[0]):
        for j in range(adjacency_matrix.shape[1]):
            if adjacency_matrix[i, j] != 0:
                edges.append((i, j, adjacency_matrix[i, j]))
    return edges

# 测试
adjacency_matrix = np.array([[0, 1, 0, 0],
                              [1, 0, 1, 0],
                              [0, 1, 0, 1],
                              [0, 0, 1, 0]], dtype=np.float32)
print("原始邻接矩阵:")
print(adjacency_matrix)

edges = adjacency_matrix_to_edges(adjacency_matrix)
print("\n转换后的边列表:")
print(edges)

在这段代码中,我们遍历邻接矩阵的每个元素,如果元素的值不为零,则将其转换为边列表中的一条边。对于有权重的图,我们将权重信息也一并保存在边列表中。

通过这个转换过程,我们可以将邻接矩阵表示的图转换为边列表形式,从而方便进行一些算法的实现和应用。

总结与展望

本文介绍了如何使用Python将原始边列表转换为邻接矩阵,并进行了一系列的扩展和优化,以满足不同场景下的需求。我们从处理无向图和有向图、带权重的边列表,到使用稀疏矩阵优化内存占用,再到图的可视化和邻接矩阵转换为原始边列表,覆盖了图数据处理的多个方面。

在实际应用中,图数据处理是一个非常重要且广泛应用的领域,涉及到网络分析、社交网络、交通规划、生物信息学等诸多领域。掌握图数据处理的技能,能够帮助我们更好地理解和分析复杂的数据结构,从而解决实际问题。

未来,随着数据规模的不断增大和复杂性的增加,图数据处理领域将面临更多挑战和机遇。我们可以期待更多高效、灵活和功能丰富的工具和算法的出现,以应对不断变化的需求和挑战。同时,我们也可以持续学习和探索,不断提升自己在图数据处理领域的能力和水平,为解决实际问题做出更大的贡献。

希望本文对你理解和应用图数据处理有所帮助,也欢迎你进一步深入学习和探索这个领域,为数据科学和工程的发展贡献力量。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/567066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

驱动比例换向阀放大器

比例换向阀放大器技术是电液比例系统中关键的组成部分,它主要用于控制比例阀,实现对液压流量或压力的精确控制。 高精度控制:通过比例阀放大器,系统可以非常精确地调节液压流量或压力,这对于要求精密操作的机械系统来说…

DSP系统的设计过程与选型

DSP的设计步骤分几个阶段,应用系统的设计过程如图所示。 技术指标的确定 器件的选型原则 其他因素的考虑

学习c语音的自我感受

因为是自学,所以走过不少弯路。去年,受知乎“python性能弱”风潮的影响,学过go,rust。 在学习这些新语言的时候,由衷感受到,或是本身侧重方向的原因(如go侧重服务器),或是语言太新不…

Php-WebView 现代跨平台 GUI分享

GitHub :php-webview 一个用于 C/C 的小型跨平台 Web 视图库,用于构建现代跨平台 GUI。 该项目的目标是为最广泛使用的平台创建一个通用的 HTML5 UI 抽象层。 它支持双向 JavaScript 绑定(从 C/C 调用 JavaScript 和从 JavaScript 调用 C/C)。…

蛋白质致病突变的计算方法(四)

3.1.5 域定位 (domain location) 残基在序列中的位置可分为N-terminal(1-30%)、中间(31-70%)和C-terminal(71-100%)。Singh等人报告称,TP53的中心和高度保守的DNA结合域包含一簇体细胞错义突变,包括R175、G245、R248和R273。这些突变形成与DNA的直接接触…

Docker 部署 WordPress 并完成建站

什么是 WordPress WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一款个人博客系统,并逐步演化…

DC-DC电源设计中电感选型详解

电感参数: DC-DC 电感选型步骤: 1, 根据 DC-DC 的输入输出特性计算所需的最小电感量。 (1)对于 Buck 型 DC-DC,计算公式如下 Lmin= 【Vout*(1-Vout/Vinmax)】/ (Fsw*Irpp ) 其中: Vinmax = maximum input voltage Vout = output voltage fsw = switching frequency…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容,欢迎访问天池技术圈官方地址:第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例:基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失,为何权重更新是对的?1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…

Qt 菜单栏上手教程:QMenuBar QMenu QToolbar

引言 在Qt框架中,QMenuBar、QMenu、QToolbar和QAction都是用于构建应用程序界面中的用户交互元素。 QMenuBar 是什么:QMenuBar是一个用于创建横向菜单栏的类。在桌面应用程序中,它通常位于窗口的顶部。应用场景:当您需要一个包含…

CTF小工具

1 ciphey https://github.com/Ciphey/Ciphey Ciphey 是一个使用自然语言处理和人工智能的全自动解密/解码/破解工具。 简单地来讲,你只需要输入加密文本,它就能给你返回解密文本。就是这么牛逼。 有了Ciphey,你根本不需要知道你的密文是哪…

ros2_control【B站WMGIII教学学习记录】1

资源 https://www.bilibili.com/video/BV1ku411G7UR? 学习过程中存在bug,记录一下 1 Q:"package ‘joint_state_publisher_gui’ not found, searching: [/home A: sudo apt install ros-humble-joint-state-publisher2 https://fishros.org.cn/forum/to…

如何高效的压缩GIF图片?一键搞定GIF动图压缩 就是这么简单

一,引言 压缩GIF动图是一个常见的需求,无论是在社交媒体上分享动态表情,还是在网页设计中添加动态元素,GIF动图都扮演着重要的角色。然而,过大的GIF文件大小可能会导致加载速度慢,影响用户体验。因此&…

Github首页美化(updating)

Github首页美化 https://github.com/QInzhengk一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 https://github.com/QInzhengk 一、新建仓库 对Github首页进行美化,需要新建一个仓库名和自己 Github 用户名相同的仓库…

YOLC: You Only Look Clusters for Tiny Object Detection in Aerial Images

摘要 由于以下因素,从航拍图像中检测物体面临着重大挑战:1)航拍图像通常具有非常大的尺寸,通常有数百万甚至数亿像素,而计算资源有限。2)物体尺寸较小导致有效信息不足,无法进行有效检测。3)物体分布不均匀导致计算资源浪费。为了解决这些问题,我们提出YOLC(You Onl…

Python ADTK库:时间序列异常检测的利器

更多Python学习内容:ipengtao.com ADTK(Anomaly Detection Toolkit)是一个用于时间序列异常检测的Python库,提供了多种算法和工具,帮助用户识别和分析时间序列数据中的异常点和趋势变化。本文将详细介绍ADTK库的功能、…

2024年学浪视频怎么缓存

2024年已经到来,越来越多的人开始购买学浪视频,然而一些课程的时间限制使得许多人希望能够永久保存这些宝贵的学习资源。幸运的是,本文将向大家介绍一个解决方案——使用小浪助手工具来下载学浪视频,以便随时随地享受学习的乐趣。…

C++实战演练---负载均衡在线oj项目预热

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 学习准备了快一年时间,心心念念的实战演练终于可以开始了,话不多说,直接进入主题…

从构成看自来水厂自动化控制系统的创新与发展

自来水厂自动化控制系统涵盖了多个关键组成部分,包括水管理云平台、供水监控系统以及供水调度平台。 系统内嵌了一系列自主创新的核心算法,这些算法结合了数学建模、机器仿真和流体力学等多元数据模型,以优化设备间的关联和控制关系&#xf…

Midjourney-01 初试上手 注册使用并生成你的第一张AI图片 详细流程 提示词 过程截图 生成结果 付费文生图的天花板!

背景介绍 Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法来辅助用户进行绘画创作。这款软件能够通过用户输入的文本描述生成图像,支持多种生成方式,包括文字生成图片、图片生成图片和混合图片生成图片。 图像生成方式&#…