如何将稀疏邻接矩阵转换为稠密邻接矩阵



我正试图将仅包含非零元素([[rows],[columns]](索引的稀疏邻接矩阵/列表转换为索引处包含1的密集矩阵,否则为0。我使用Pytorch几何(文档(中的to_dense_adj找到了一个解决方案。但这并不是我想要的,因为稠密矩阵的形状并不像预期的那样。这里有一个例子:

sparse_adj = torch.tensor([[0, 1, 2, 1, 0], [0, 1, 2, 3, 4]])

因此,密集矩阵的大小应该是5x3(第二个阵列"存储"列;在(0,0(、(1,1(、(2,2(、(1,3(和(0,4(处具有非零元素(,因为第一个阵列中的元素低于或等于2。

然而,

dense_adj = to_dense(sparse_adj)[0]

输出密集矩阵,但形状为(5,5(。是否可以定义输出形状,或者是否有不同的解决方案来获得我想要的?

编辑:我有一个解决方案可以将其转换回稀疏表示,现在可以使用

dense_adj = torch.sparse.FloatTensor(sparse_adj, torch.ones(5), torch.Size([3,5])).to_dense()
ind = dense_adj.nonzero(as_tuple=False).t().contiguous()
sparse_adj = torch.stack((ind[1], ind[0]), dim=0)

或者有其他更好的方法吗?

您可以通过首先用torch.sparse构造稀疏矩阵,然后将其转换为密集矩阵来实现这一点。为此,您需要为torch.sparse.FloatTensor提供一个2D索引张量、一个值张量以及一个输出大小:

sparse_adj = torch.tensor([[0, 1, 2, 1, 0], [0, 1, 2, 3, 4]])
torch.sparse.FloatTensor(sparse_adj, torch.ones(5), torch.Size([3,5])).to_dense()

您可以使用动态获取输出矩阵的大小

sparse_adj.max(axis=1).values + 1

所以它变成了:

torch.sparse.FloatTensor(
sparse_adj, 
torch.ones(sparse_adj.shape[1]), 
(sparse_adj.max(axis=1).values + 1).tolist())

最新更新