はじめに: この記事では、主に Pytorch と Numpy を使用して、グラフの隣接行列と COO 疎行列 (edge_index と edge_w) の間の相互変換を実現します。
1. グラフの 2 つの表現
1.1 通常の隣接行列 AdjacencyMatrix
この記事で言及されているグラフは、無向グラフ G(V, E) を指しており、隣接行列は以下の図 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
*ご不明な点やエラーがある場合は、以下にメッセージを残してください。転載 出典を明示してください
参考記事: