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

news2024/9/20 8:53:04

👽发现宝藏

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

在图论和网络分析中,图是一种非常重要的数据结构,它由节点(或顶点)和连接这些节点的边组成。在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.coloradmin.cn/o/1617541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美业连锁多门店收银系统源码-美业系统iPad端使用前准备工作分享

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、 购买一台iPad并安装应用 请使用系统版本在10.0.0或以上的苹果iPad(建议购…

node-sass安装失败解决

老项目安装node-sass4.14.1一直失败 "node-sass": "^4.14.1",报错环境变量Path 中没有 python2.7 gyp verb check python checking for Python executable "python2.7" in the PATH安装python2.7,然后设置npm config set python C:\Python27 …

HART协议

一、HART协议 HART 协议采用美国电话通讯系统Bell202频移键控(FSK)标准,在4~20mA的模拟0.5mA的正弦波,波特率是 1200bps。因为所叠加的正弦信号平均值为0,而且相位连续频移键控技术要求在波特率为 1200Hz的数据位 1 和 0 的边界的…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

mybatis拦截器和mybatis plus的拦截器

MyBatis拦截器和MyBatis Plus的拦截器在概念上是一致的,都是通过拦截器机制对MyBatis的SQL执行过程进行扩展和控制,但是在实现细节和功能上有所差异。MyBatis Plus的拦截器是建立在MyBatis拦截器基础之上,通过封装简化了开发流程,…

动物解剖流程3d仿真展示动画支持反复观看和使用

在兽医专业的广袤领域中,动物解剖学作为基石学科,为组织胚胎学、生理学、病理解剖学、外科手术学、临床诊断学等科研教学提供了坚实的基础。而如今,随着科技的飞速发展,我们迎来了一个全新的学习时代——3D数字动物解刨虚拟仿真实…

ESP32-Thonny 拍摄图片到SD卡

前言: 代码运行在Thonny 添加main.py到单片机中: 可以先运行一下试试:会输出以下信息: 没有问题的话(SD卡挂载成功,摄像头初始化成功)运行一次主程序后,闪光灯会闪烁一下。 代码&…

autodesk系列软件安装错误1603,手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067

一般Autodesk Desktop Licensing Service这个服务没安装或者不正常会导致autodesk系列软件安装错误1603或者其他报错。 手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067, 解决方法如下 打开autoremove点击扩展功能,输…

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

李廉洋:4.23黄金休市之后一蹶不振,原油小幅度上涨。晚间策略!

美国利率居高不下&#xff0c;降低了黄金等非收益资产的吸引力。今天的经济数据可能会影响美联储的利率决定&#xff0c;从而可能影响金价走势。美国货币政策对黄金价格的影响&#xff0c;美元走强以及对美国利率持续高企的预期&#xff0c;正对金价施加额外压力。美联储对持续…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区&#xff01; 去年 12 月&#xff0c;Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…

我的世界服务器设计思路应该是什么样?

我的世界服务器设计思路可以从这4个方面展开&#xff1a;1.选择你喜欢的东西&#xff1b;2.认识你的极限&#xff1b;3.注入新鲜元素&#xff1b;4.让服务器变得享受且有回报。 1.选择你喜欢的东西 设计服务器的首要规则是创造一些你自己会积极享受玩的东西。没有人愿意花费宝…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

刷题训练之二分查找

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握二分查找算法 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

计算IP地址总个数的方法及其应用

IP地址是计算机网络中用于唯一标识和定位设备的数字地址&#xff0c;是Internet Protocol&#xff08;IP&#xff09;的核心组成部分。计算IP地址的总个数是网络规划和管理中的重要任务之一&#xff0c;本文将介绍计算IP地址总个数的方法及其应用。 IP地址查询&#xff1a;IP数…

STM32 学习13 低功耗模式与唤醒

STM32 学习13 低功耗模式与唤醒 一、介绍1. STM32低功耗模式功能介绍2. 常见的低功耗模式&#xff08;1&#xff09;**睡眠模式 (Sleep Mode)**:&#xff08;2&#xff09;**停止模式 (Stop Mode)**:&#xff08;3&#xff09;**待机模式 (Standby Mode)**: 二、睡眠模式1. 进入…

基于CAPL的BIN文件解析

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

管理 Python 项目的艺术:在 PyCharm 中使用虚拟环境(以BPnP为例)

在 PyCharm 中使用虚拟环境对于 Python 项目开发具有多方面的重要作用&#xff0c;这些作用体现在提升项目管理的效率、保障代码的可运行性以及维护项目的长期稳定性等方面。以下是使用虚拟环境的几个关键好处&#xff1a; 1. 依赖管理和隔离 虚拟环境允许每个项目拥有…

Adobe Photoshop CC 2017无法打开解决方案

Adobe Photoshop CC 2017双击无反应&#xff0c;右键以管理员身份运行也没有反应 解决方案&#xff1a; 事件查看器中查看应用程序的事件 如果找到程序报错事件&#xff0c;网上下载ZXPSignLib-minimal.dll文件替换错误模块路径位置的该文件即可 ZXPSignLib-minimal.dll下载地…