邻接矩阵与Pyg数据格式互相转换

普通邻接矩阵转换为Pyg数据格式

       from torch_geometric.data import Data
        if self._args.dataset == 'acm':
            adj_list, truefeatures, label, idx_train, idx_val, idx_test, adj_fusion = load_acm_mat()
        elif self._args.dataset == 'imdb':
            adj_list, truefeatures, label, idx_train, idx_val, idx_test, adj_fusion = load_imdb()
        features = preprocess_features(truefeatures)
        features = torch.FloatTensor(features)
        label = torch.FloatTensor(label)
        label = torch.argmax(label, dim=1)
        self.idx_train = torch.LongTensor(idx_train).to(args.device)
        self.idx_val = torch.LongTensor(idx_val).to(args.device)
        self.idx_test = torch.LongTensor(idx_test).to(args.device)
        edge_index_view0 = sparse_mx_to_torch_sparse_tensor(adj_list[0]).float()._indices() #adj_list[0]._indices()
        edge_index_view1 = sparse_mx_to_torch_sparse_tensor(adj_list[1]).float()._indices() #adj_list[1]._indices()
        edge_weight_0 = torch.Tensor(np.ones(edge_index_view0.shape[1]))
        edge_weight_1 = torch.Tensor(np.ones(edge_index_view1.shape[1]))
        data0 = Data(
            x=features,
            edge_index=edge_index_view0,
            edge_attr=edge_weight_0,
            y=label)

Pyg数据格式转换为邻接矩阵

adj = coo_matrix(
            (np.ones(data.num_edges), (data.edge_index[0].numpy(), data.edge_index[1].numpy())),
            shape=(data.num_nodes, data.num_nodes))

这里生成的邻接矩阵权重为全1,如果要生成带权重的邻接矩阵,可以将np.ones(data.num_edges)替换为带权重的tensor
也可以在生成adj矩阵后,再对其normalize

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
邻接表和邻接矩阵是两种常用的图表示方法,它们可以互相转化。下面是它们之间的转化方法: 1. 邻接表转邻接矩阵: - 创建一个空的邻接矩阵,大小为图中顶点的个数。 - 遍历邻接表中的每个顶点,对于每个顶点,遍历其对应的邻接链表,将邻接顶点在邻接矩阵中的位置标记为1。 - 如果图是有向图,则只标记出边;如果图是无向图,则标记出边和入边。 - 邻接矩阵中未标记的位置表示两个顶点之间没有边。 - 返回生成的邻接矩阵。 2. 邻接矩阵转邻接表: - 创建一个空的邻接表,大小为图中顶点的个数。 - 遍历邻接矩阵中的每个顶点,对于每个顶点,遍历其对应的邻接矩阵行,找到值为1的列,将该列对应的顶点添加到邻接表中的对应顶点的邻接链表中。 - 如果图是有向图,则只添加出边;如果图是无向图,则添加出边和入边。 - 返回生成的邻接表。 下面是一个示例代码,演示了邻接表和邻接矩阵的转化过程: ```python # 邻接表转邻接矩阵 def adjacency_list_to_matrix(adj_list): num_vertices = len(adj_list) adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] for i in range(num_vertices): for j in adj_list[i]: adj_matrix[i][j] = 1 return adj_matrix # 邻接矩阵转邻接表 def adjacency_matrix_to_list(adj_matrix): num_vertices = len(adj_matrix) adj_list = [[] for _ in range(num_vertices)] for i in range(num_vertices): for j in range(num_vertices): if adj_matrix[i][j] == 1: adj_list[i].append(j) return adj_list # 示例邻接表 adj_list = [[1, 2], [0, 2], [0, 1, 3], [2]] # 邻接表转邻接矩阵 adj_matrix = adjacency_list_to_matrix(adj_list) print(adj_matrix) # 邻接矩阵转邻接表 adj_list_new = adjacency_matrix_to_list(adj_matrix) print(adj_list_new) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值