在使用图神经网络的过程中,往往需要使用到相关的 GNN 库,而在这些 GNN 库中,一款比较高效热门的图神经网络库是 PyTorch 中的 PyG 库。PyG 提供了很多经典的图神经网络模型和图数据集,通常在使用 PyG 框架来构建和训练图模型时,需要事先选择合适的图数据结构来构造图,PyG 提供的选择包括 Data、HeteroData、TemporalData。而在实验的过程中,可能需要使用到 networkx 提供的一些功能来实现与图相关的操作,这时图数据需要在两个框架提供的图结构之间进行转换,基于此,本文主要针对转换操作进行了整理和总结。

一、数据准备

本文以简单图为例,同构图与异构图(无向图)如下所示:

1、构建 PyG 同构图

import torch
from torch_geometric.data import Datadata = Data()# 初始化节点特征
data.x = torch.tensor([[-1], [0], [1]], dtype=torch.float)# 初始化边索引
data.edge_index = torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtype=torch.long)

2、构建 PyG 异构图

import torch
from torch_geometric.data import HeteroDatadata = HeteroData()  # 初始化结点特征
# [num_papers, num_features_paper]
data['paper'].x = torch.tensor([[0, 1, 2]], dtype=torch.float)
# [num_authors, num_features_author]
data['author'].x = torch.tensor([[-1], [1]], dtype=torch.float)  # 初始化边索引
# [2, num_edges_writes]
data['author', 'writes', 'paper'].edge_index = torch.tensor([[0, 1],  [0, 0]], dtype=torch.long)data['paper', 'belongs', 'author'].edge_index = torch.tensor([[0, 0],  [0, 1]], dtype=torch.long)

3、构建 networkx 同构图

import networkx as nx# 创建无向图
G = nx.Graph()# 两种添加节点的方式 add_node 和 add_nodes_from
G.add_nodes_from([0, 1, 2])# 两种添加连边的方式,add_edge 和 add_edges_from
G.add_edges_from([[0, 1], [1, 2]])

4、构建 networkx 异构图

import networkx as nx  # 创建无向图
G = nx.Graph()  # 为节点添加 type 属性(属性名可自定义)来区分节点类型
G.add_nodes_from([0, 2], type='author')
G.add_nodes_from([1], type='paper')  # 为连边添加 type 属性(属性名可自定义)来区分连边类型
G.add_edges_from([[0, 1], [1, 2]], type='writes')  # 获取节点 & 连边类型
node_labels = nx.get_node_attributes(G, 'type')
edge_labels = nx.get_edge_attributes(G, 'type')

二、同构图转换

1、PyG 转 networkx

(1)利用 to_networkx方法直接转换

from torch_geometric.utils.convert import to_networkxG = to_networkx(data)
  • 优点:简单,高效
  • 缺点:无法处理规模较大的图(内存不足)

(2)以添加节点与连边的方式转换

import numpy as npG = nx.Graph()# 使用 add_nodes_from 批处理的效率比 add_node 高
G.add_nodes_from([i for i in range(data.x.shape[0])])# 使用 add_edges_from 批处理的效率比 add_edge 高
edges = np.array(data.edge_index.T, dtype=int)
G.add_edges_from(edges)
  • 优点:适用于规模较大的图
  • 缺点:较为复杂

2、networkx 转 PyG

import torch
import numpy as np# 创建节点特征矩阵
x = torch.ones((G.number_of_nodes(),1), dtype=torch.float)# 获取图G邻接矩阵的稀疏表示
adj = nx.to_scipy_sparse_array(G).tocoo()# 获取非零元素行索引
row = torch.from_numpy(adj.row.astype(np.int64)).to(torch.long)
# 获取非零元素列索引
col = torch.from_numpy(adj.col.astype(np.int64)).to(torch.long)# 将行和列进行拼接,shape变为[2, num_edges], 包含两个列表,第一个是row, 第二个是col
edge_index = torch.stack([row, col], dim=0)data = Data(x=x, edge_index=edge_index)

三、异构图转换

1、PyG 转 networkx

(1)利用 to_networkx方法直接转换

from torch_geometric.utils.convert import to_networkxdata = data.to_homogeneous()
G = to_networkx(data)
  • 优点:简单,高效
  • 缺点:无法处理规模较大的图(内存不足)

(2)以添加节点与连边的方式转换

import numpy as npG = nx.Graph()  # 需要为节点重新排序
node_num = 0
nt_start = {}
for nt in data.node_types:  nt_start[nt] = node_num  node_num += data[nt].x.shape[0]  # 使用 add_nodes_from 批处理的效率比 add_node 高
for nt in data.node_types:  G.add_nodes_from([nt_start[nt] + i for i in range(data[nt].x.shape[0])], node_type=nt)  # 使用 add_edges_from 批处理的效率比 add_edge 高
for et in data.edge_types:  edges = np.array(data[et].edge_index.T, dtype=int)  G.add_edges_from([[nt_start[et[0]] + e[0], nt_start[et[2]] + e[0]] for e in edges],  edge_type=et[1])
  • 优点:适用于规模较大的图
  • 缺点:较为复杂

2、networkx 转 PyG

利用 networkx 框架将异构图转 PyG 图结构的情况一般不常见,通常是在 PyG 中创建了图,但为了绘制图结构,才需要转换为 networkx 框架下的图,再利用 networkx 提供的接口进行绘制。

【PyG】与networkx的图转换相关推荐

  1. PyG (PyTorch Geometric) 异质图神经网络HGNN

    诸神缄默不语-个人CSDN博文目录 PyTorch Geometric (PyG) 包文档与官方代码示例学习笔记(持续更新ing-) 本文介绍使用PyG实现异质图神经网络(HGNN)的相关操作. 本文 ...

  2. Intel Realsense D435 opencv 为什么将color图转换成灰度图后,再与depth图水平堆叠,其结果一片黑色?(数据未map到0-255)

    相关代码 # -*- coding: utf-8 -*- """ @File : obstacle_detection.py @Time : 2019/12/11 10: ...

  3. 灰度图转换成彩色图和彩虹图

    把灰度图转换成彩色图和彩虹图 1. 灰度图转换成彩色图 void Gray2Color(const cv::Mat const &src, cv::Mat &dst){     dst ...

  4. html视频怎么转换成图片,如何将小视频转换成GIF动图或将GIF动图转换成视频

    现在GIF动图是越来越流行了.在过去,它是我们在Web上唯一能展示动画图片的技术.这种技术非常的有用,因为,相对于Real Video Player, Windows Media等技术,都需要特殊的浏 ...

  5. matlab将图片转成eps,【MATLAB】论文图片处理(各种数据图转换成eps格式)

    最近跟eps图片杠上了..转载一个人人网上matlab到eps图片输出格式较好的方法 随着Latex在论文编辑和排版的日益普及,越来越多的人写文章都用Latex,数据图表作为论文不可缺少的一部分,如何 ...

  6. er图转换成关系模型的例题_有关数据库系统的练习题 E-R图的关系画图转换,,急需 谢谢了...

    展开全部 你看62616964757a686964616fe58685e5aeb931333332643239下下边的例子,你的问题就可以解决了. 设某商业集团数据库中有三个实体集.一是"商 ...

  7. matlab eps格式,【MATLAB】论文图片处理(各种数据图转换成eps格式)

    最近跟eps图片杠上了..转载一个人人网上matlab到eps图片输出格式较好的方法 随着Latex在论文编辑和排版的日益普及,越来越多的人写文章都用Latex,数据图表作为论文不可缺少的一部分,如何 ...

  8. 【突破二次元壁】手把手教你用AnimeGAN将风景图转换成宫崎骏动漫风

    [突破二次元壁!]手把手教你用AnimeGAN将风景图转换成宫崎骏动漫风! 未经作者允许,本文禁止转载 0. 效果图: 1. 下载源码: 2. 下载预训练模型: 3. 准备图片: 4. 开始转换: 5 ...

  9. NetworkX创建图

    [A3]创建图-连接表和邻接表创建图 连接表csv文件如下 创建图 G = nx.DiGraph() #有向 G = nx.Graph() #无向 print(G.is_directed()) # 给 ...

最新文章

  1. NLP实践:对话系统技术原理和应用
  2. 基于 MongoDB 及 Spring Boot 的文件服务器的实现
  3. linux7主机名设置,centos7主机名、网络设置
  4. mysql_connect报告“No such file or directory“错误的解决方法
  5. 【kafka】kafka 查看 GroupCoordinator 以及 kafka Group dead 消费组死掉 以及 GroupCoordinatorRequest 使用
  6. web前端中的命名规则
  7. Oracle 高 Version counts 问题说明
  8. python爬虫使用模块_10分钟教你Python爬虫(下)--爬虫的基本模块与简单的实战...
  9. C# Web Service 不使用服务引用直接调用方法(转)
  10. 86. php 绘图体系(2)
  11. 机器学习 —— 联合概率分布
  12. 台式计算机怎么开声音,台式机如何设置声音
  13. 计算机如何解锁 磁盘,怎么解除Dell电脑硬盘的bitlocker加密
  14. 小故事大道理--驴子的逃离
  15. 修改域名后Git拉取代码出现警告Are you sure you want to continue connecting (yes/no)
  16. 抗D保 | 抗D宝 | 知道创宇云安全
  17. 单页面SPA和多页面MPA应用的区别
  18. 神经网络分类器的原理图,神经网络分类器是什么
  19. 脚手架创建遇到报错:Error: command failed: pnpm install --reporter silent --shamefully-hoist
  20. Sublime 使用总结

热门文章

  1. 蛋白质相互作用系列:GN算法
  2. 局域网怎么查看单位摄像头_简单易用,夜里看的更清楚,360新品水滴摄像头夜视版实测...
  3. Java中你最擅长什么_你最擅长的领域是什么
  4. 数字孪生数字工厂 数字孪生工厂解决方案
  5. Mac使用命令行工具解压和压缩rar文件
  6. mac实用小技巧之解压.xip文件
  7. 华为IT总监徐家骏的10年
  8. centos7 安装Kong和Konga
  9. 化学反应中的能量变化
  10. mysql数据库备份方式