[GNN图神经网络]普通邻接矩阵和 Adjacency Matrix 与 COO稀疏矩阵(edge_index, 和edge_w)相互转化

发布于:2023-02-05 ⋅ 阅读:(976) ⋅ 点赞:(0)

 导言: 本文主要使用Pytorch 和 Numpy 实现图的 Adjacency Matrix 与 COO稀疏矩阵(edge_index, 和edge_w)相互转化

1. 图的两种表示方式

1.1 普通邻接矩阵 AdjacencyMatrix

本文所指的图是指Undirected graph G(V, E),并且Adjacency Matrix 如下图F所示。

1.2 图的边的连接度和连接权重 edge_index, edge_w,即COO稀疏矩阵

图还可以使用edge_index 和 edge_w 表示,edge_index 为 2*n 的矩阵, edge_w 为 1 * n 的矩阵。

2.实现代码

import torch
import scipy.sparse as sp
import numpy as np

#定义edge_index 和edge_w表示的图
edge_index = torch.tensor([[0, 0, 0, 1, 1, 2, 2, 2, 3, 3],
                           [1, 2, 3, 0, 2, 0, 1, 3, 0, 2]])
edge_w = torch.rand(10)

#将edge_index 和edge_w扩展成3维的张量,实做中第0维就是表示batch,这里batch_size = 64
big_edge_index = edge_index.unsqueeze(dim = 0)
big_edge_index = big_edge_index.repeat_interleave(64, dim=0)

big_edge_w = torch.rand(64, 10)

n = 64

#将edge_index 和edge_w表示的图 转化成 邻接矩阵表示的图
adj = torch.zeros(64, 4, 4)
for i in range(n):
    adj_matrix = sp.coo_matrix(arg1=(big_edge_w[i, :], (big_edge_index[i,0,:], big_edge_index[i,1,:])), shape=(4,4))
    adj_matrix = adj_matrix.todense()
    adj[i] = torch.from_numpy(adj_matrix)

#邻接矩阵表示的图转化为edge_index 和edge_w表示的图
for j in range(n):
    tmp_index = torch.nonzero(adj[j]).T
    tmp_data= adj[j][tmp_index[0], tmp_index[1]]
    tmp_index = tmp_index.unsqueeze(dim=0)
    tmp_data = tmp_data.unsqueeze(dim=0)
    if j == 0:
        index = tmp_index
        data = tmp_data
    else:
        index = torch.cat([index, tmp_index], dim=0) 
        data = torch.cat([data, tmp_data], dim=0)

new_edge_index = index
new_edge_w = data

*如有问题和错误请在下方留言。转载请标明出处

参考文章:

[1]普通邻接矩阵转换成edge_index的COO稀疏矩阵形式,格式为[2, num_messages]_weixin_46269351的博客-CSDN博客普通邻接矩阵转换成edge_index的COO稀疏矩阵形式,格式为[2, num_edges]。平时我们接触的邻接矩阵adj的形式要么是稠密矩阵(原始二维矩阵),但是在使用PyG框架的时候会发现格式不对,需要形式为[2, edges]的coo_matrix。首先,把adj转为普通的coo_matrix矩阵:adj = sp.coo_matrix(adj)(0, 633) 1(0, 1862) 1(0, 2582) 1(0, 2) 1. .. .(2707, 165) 1(27https://blog.csdn.net/weixin_46269351/article/details/121609178

[2] 成功解决 python 将稀疏矩阵转换成普通矩阵_littlehaes的博客-CSDN博客_python todense调用todense()方法即可, 如下面的示例, b是一个稀疏矩阵, 使用todense()方法将稀疏矩阵b转换成稠密矩阵cimport scipy.sparse as spimport numpy as npa = np.array([[0,3,2],[0,4,5],[1,3,6],[1,5,7],[2,4,10]])b = sp.coo_matrix(arg1=(a[:, 2], ...https://blog.csdn.net/littlehaes/article/details/103523512

本文含有隐藏内容,请 开通VIP 后查看