如何在Python中将加权边列表转换为邻接矩阵?

2023-12-03

数据存在于 Excel 文件中,第一列代表第一个节点,第二列代表第二个节点,第三列包含权重。

节点是字符串。

Eg:

苹果香蕉 65
橙苹果 32


首先要做的是导入 Excel 文件。最直接的方法是使用pandas:

import pandas
data = pandas.read_excel("path/to/edgelist", header=None)

这将返回以下形式的数据框

In [2]: data  
Out[2]:  
        0       1   2  
0   Apple  Banana  65  
1  Orange   Apple  32  

捷径:使用networkx

我们首先加载networkx包

import networkx

然后,从data我们将边列表视为列表的列表:

edgeList = data.values.tolist()

这样,我们得到

In [19]: edgeList
Out[19]: [['Apple', 'Banana', 65], ['Orange', 'Apple', 32]]

让我们创建一个空(有向)图G:

G = networkx.DiGraph()

然后我们用一个简单的 for 循环添加边:

for i in range(len(edgeList)):
    G.add_edge(edgeList[i][0], edgeList[i][1], weight=edgeList[i][2])

我们可以轻松地检索邻接矩阵

A = networkx.adjacency_matrix(G).A

读起来简单明了numpy array

In [30]: A
Out[30]:
array([[ 0, 65,  0],
       [ 0,  0,  0],
       [32,  0,  0]], dtype=int64)

NOTE:上面的邻接矩阵指的是一个带权有向图(即从Apple到Banana有边,但从Banana到Apple没有边)。如果需要一个带权无向图(即,如果从 Apple 到 Banana 存在一条边,那么从 Banana 到 Apple 也存在一条边),只需使用

G = networkx.Graph()

代替

G = networkx.DiGraph()

漫长的道路:手动

让我们获取第一列和第二列来收集节点 ID

nodes = data.iloc[:, 0].tolist() + data.iloc[:, 1].tolist()

thus

In [4]: nodes
Out[4]: [u'Apple', u'Orange', u'Banana', u'Apple']

让我们排序并删除重复项(无论如何排序不是强制性的)

nodes = sorted(list(set(nodes)))

and nodes现在有形式

In [8]: nodes
Out[8]: [u'Apple', u'Banana', u'Orange']

让我们用一个连续的数字 ID 来映射每个节点(字符串)以馈送到邻接矩阵

nodes = [(i,nodes[i]) for i in range(len(nodes))]

and nodes现在有形式

In [10]: nodes
Out[10]: [(0, u'Apple'), (1, u'Banana'), (2, u'Orange')]

现在字符串到整数的映射已经完成,让我们替换原始数据帧(data) 每个字符串及其对应的 ID

In [15]: for i in range(len(nodes)):
    ...:     data = data.replace(nodes[i][1], nodes[i][0])

and now data有形式

In [16]: data
Out[16]:
   0  1   2
0  0  1  65
1  2  0  32

所以你会看到每次出现Apple已替换为0,每次出现Banana已替换为 1 并且每次出现 odOrange已替换为 2(根据变量nodes).

为了构建邻接矩阵,让我们导入另一个众所周知的包(scipy)

from scipy.sparse import coo_matrix 

并创建一个基于坐标的稀疏矩阵

M = coo_matrix((data.iloc[:,2], (data.iloc[:,0],data.iloc[:,1])), shape=(len(nodes), len(nodes)))

这将创建一个稀疏邻接矩阵(对于具有许多节点和少量边的图,内存占用更少)。如果你需要一个稠密的邻接矩阵,那么

M = M.todense()

where M终于有了形式

matrix([[ 0, 65,  0],
        [ 0,  0,  0],
        [32,  0,  0]])

NOTE:上面的邻接矩阵指的是一个带权有向图(即从Apple到Banana有边,但从Banana到Apple没有边)。如果需要一个带权无向图(即如果从Apple到Banana存在一条边,那么从Banana到Apple也存在一条边),只需将上面的邻接矩阵转置即可

M_symmetric = M + M.T 

where

In [38]: M_symmetric
Out[38]:
matrix([[ 0, 65, 32],
        [65,  0,  0],
        [32,  0,  0]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中将加权边列表转换为邻接矩阵? 的相关文章

  • 如何打印前面有一定数量空格的整数?

    C has printf Xd Y 它只打印整数 X 并使其在控制台窗口上占据 Y 空格 例如 printf 3d 10 console 10 printf 5d 5 console 5 我如何在 python 3 中使用它 This pr
  • 函数名称未定义

    我有一段代码 看起来像这样 if name main main def main print hello 但是 当我尝试运行此代码时 出现错误 NameError 名称 main 未定义 我是否没有在函数 def main 的第一行定义名称
  • 在 SQLAlchemy 中,过滤器是在连接之前还是之后应用?

    使用 SQLAlchemy 我执行如下查询 import models as m import sqlalchemy as sa s session maker q s query m ShareCount m Article join m
  • 按每个元素中出现的数字对字符串列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个脚本 其目的是对不断下载到服务器上的空间数据集文件进行排序和处理 我的列表目前大致如下 list file t00Z wrff02 grib2 file t00Z wrff03 grib2 file t0
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 删除 tkinter 文本默认绑定

    我正在制作一个简单的 tkinter 文本编辑器 但我想要所有默认绑定文本小部件如果可能的话删除 例如当我按Ctrl i它默认插入一个制表符 我制作了一个事件绑定来打印文本框中有多少行 我将事件绑定设置为Ctrl i以及 当我运行它时 它会
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • 对法语文本进行词形还原[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些法语文本需要以某种方式进行处理 为此 我需要 首先 将文本标记为单词 然后对这些单词进行词形还原以避免多次处理相同的词根 据我
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • Python FTP下载550错误

    我编写了一个 ftp 爬虫来下载特定文件 它会一直工作 直到找到要下载的特定文件 然后抛出此错误 ftplib error perm 550 该文件存在于我的下载文件夹中 但文件大小为 0 kb 我需要转换某些内容才能下载吗 我可以访问 f
  • 增强迪基-富勒测试中的 BIC 在 Python 中到底是如何工作的?

    这个问题是关于 statsmodels tsa stattools python 库 adfuller 中的增强迪基 富勒测试实现 原则上 AIC 和 BIC 应该计算一组可用模型的信息标准 并选择最好的模型 信息损失最低的模型 但它们在增
  • 为什么我无法杀死 k8s pod 中的 python 进程?

    我试图杀死一个 python 进程 ps aux grep python root 1 12 6 2 1 2234740 1332316 Ssl 20 04 19 36 usr bin python3 batch run py root 4
  • 如何使用 python 模块的多个 git 分支?

    我想使用 git 来同时处理我正在编写的模块中的多个功能 我目前正在使用 SVN 只有一个工作区 因此我的 PYTHONPATH 上只有该工作区 我意识到这不太理想 所以我想知道是否有人可以建议一种更 正确 的方法来做到这一点 让我用一个假
  • 关闭正在运行代码的 IPython Notebook

    怎么运行的 我在 IPython Notebook 中运行了一些代码 一些迭代工作 我不小心关闭了正在运行的笔记本的浏览器 但回到 IPython 仪表板 我发现这个特定的笔记本尚未关闭 所以如果我再次打开笔记本 我会在它正在执行的代码前面
  • 如何创建简单的梯度下降算法

    我正在研究简单的机器学习算法 从简单的梯度下降开始 但在尝试用 python 实现它时遇到了一些麻烦 这是我试图重现的示例 我获得了有关房屋的数据 居住面积 以英尺为单位 和卧室数量 以及最终的价格 居住面积 英尺2 2104 卧室 3 价
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras
  • 如何仅读取 CSV 文件每行的第一列 [重复]

    这个问题在这里已经有答案了 如何在Python中读取CSV文件每行的第一列 我的数据是这样的 1 abc 2 bcd 3 cde 我只需要循环第一列的值 另外 当我在 calc 中打开 csv 文件时 每行中的数据都在同一个单元格中 这正常
  • 将函数按元素应用于两个 DataFrame

    如何应用函数z ij f x ij y ij 来自数据框X and Y相同大小并将结果保存到 DataFrameZ 这取决于你有什么样的功能 很多功能已经被矢量化为数据框 例如 等等 所以对于这些功能 你可以简单地做Z X Y or Z X

随机推荐

  • 为 NavigableMap 编写同步线程安全包装器

    java util Collections目前提供以下实用方法来创建synchronized各种集合接口的包装器 synchronizedCollection Collection
  • javascript 中关联 []、{} 和对象之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 数组和对象有什么区别 该项目存在于数组中 但它说数组长度为 0 我对 javascript 中的对象和关联数组有点困惑 我读到了这个 question但这个问题表明两者没有太大区别 我在控制台中写了这
  • git - 当本地被删除但文件存在于远程时​​合并冲突

    我对 git 很陌生 想知道应该如何进行合并 在本地存储库中我删除了 master 分支上的几个文件 但这些文件存在于远程 master 分支中 执行 git merge 后 它会显示已发生的冲突 使用git gui显示本地文件被删除 而远
  • 错误:双端队列迭代器不可取消引用

    我正在尝试创建一个程序 将算术表达式从中缀形式转换为后缀形式 只要我不调用 infixToPostFix 函数 程序就可以正常运行 但是当我尝试运行以下代码时 出现崩溃并出现错误 双端队列迭代器不可取消引用 我找不到任何解引用运算符 所以我
  • 无法在 MacOS 上从 shm_open 写入 fd

    我正在尝试写入然后从使用打开的文件描述符中读取shm open 它在 Linux 上按我的预期工作 但在 macOS 上却不行 特别是 macOS Monterey 12 5 21G72 这是代码 include
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 如何使用 pyodide 在项目中导入模块而不出现错误?

    每当我在 pyodide 中导入 python 模块时 都会出现此错误 pyodide js 108 Invalid package name or URI 我不确定如何正确导入模块 我已经尝试过文档中提到的这个 pyodide loadP
  • 为什么我们不能对 float 和 double 数据类型使用按位运算符

    我是 c 的新手 在这里我试图以存储在内存中的方式打印存储在 float 和 double 变量中的值 但编译器不允许我在浮点和双精度变量上使用按位运算符 我想知道为什么我们不能使用像 和 这样的按位运算符float 和 double 数据
  • 添加到

    内的每个单词

    我想将 添加到 内的每个单词 该链接应该包含它所包围的单词 该网页有许多不同的 h3 h3 add links h3 h3 to each word h3 结果应该是这样的 h3 a href add add a a href links

  • 如何使用ffmpeg的库将YUV420P图像转换为JPEG?

    我正在尝试转换 YUV420P 图像 AV PIX FMT YUV420P 使用 ffmpeg 转换为 JPEGlibavformat and libavcodec 到目前为止 这是我的代码 AVFormatContext pFormatC
  • 重复多个函数参数

    Typescript 中有没有一种方法可以动态输入默认情况下采用 2 个参数但应该能够重复处理这些参数的函数 should be allowed myFunction paramA paramB myFunction paramA para
  • .NET - 将通用集合转换为数据表

    我正在尝试将通用集合 列表 转换为数据表 我发现以下代码可以帮助我做到这一点 Sorry about indentation public class CollectionHelper private CollectionHelper th
  • 如何在触发器函数中将 NEW.* 传递给 EXECUTE

    我有一个简单的任务是将巨大的 MD5 值插入到表 分区表 中 并创建了一个触发器和一个触发器函数来代替INSERT手术 在函数中我检查了前两个字符NEW md5以确定应插入哪个表 DECLARE tb text BEGIN IF TG OP
  • NoSuchMethodError:Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzEq()Z;

    以下是我的应用程序上不断出现的致命错误 我正在尝试使用 Firebase 在我的应用程序上运行聊天信使功能 它正在运行 但此后它一直使应用程序完全崩溃 我对代码进行了一些编辑 希望能解决问题 但没有成功 我一直在 youtube 上关注这个
  • 如何将复数的虚部设置为零?

    我需要检查虚部是否非常小 如果是 则将其设置为零 以便消除一些浮点错误 这些错误会导致在应该为零的情况下产生非常小的非零虚部 我的代码如下 kz2 SQRT n2 2 0 PI eta 2 kxarray p 2 kz1 SQRT n1 2
  • 使用 CSS sprites 在表单元素上定位背景图像

    我正在尝试使用放大镜作为输入元素的背景 放大镜图标是 CSS 精灵的一部分 如下所示 为了定位它 我使用了这些属性 search form input type text background url images icons png no
  • MATLAB:任意数量的元胞数组的组合

    MATLAB 中是否有命令或单行策略可以返回以下组件的所有组合n元胞数组 采取n一次 我想要完成的一个例子 A a1 a2 B b1 b2 b3 C combinations A B C a1 b1 a1 b2 a1 b3 a2 b1 a2
  • 如何在 JTable 之后添加 JButton

    我有一个 JTable 其中包含一些像这样的 SSCCE 数据 import java awt import java awt event import javax swing import java io import javax swi
  • Microsoft Graph API BETA - 返回加密/散列的 userPrincipalName 的报告

    当调用报告端点之一时 例如https graph microsoft com beta reports getTeamsUserActivityUserDetail 期间 D7 format application json 对于我们的租户
  • 如何在Python中将加权边列表转换为邻接矩阵?

    数据存在于 Excel 文件中 第一列代表第一个节点 第二列代表第二个节点 第三列包含权重 节点是字符串 Eg 苹果香蕉 65橙苹果 32 首先要做的是导入 Excel 文件 最直接的方法是使用pandas import pandas da