Как преобразовать разреженную в плотную матрицу смежности?
Я пытаюсь преобразовать разреженную матрицу/список смежности, которая содержит только индексы ненулевых элементов ([[строки], [столбцы]]), в плотную матрицу, содержащую 1 в индексах и в противном случае 0. Я нашел решение, используя to_dense_adj из геометрического Pytorch (Документация ). Но это не совсем то, что я хочу, так как форма плотной матрицы не такая, как ожидалось. Вот пример:
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)
Или есть альтернативный способ, который лучше?
1 ответ
Вы можете добиться этого, сначала построив разреженную матрицу сtorch.sparse
затем преобразовать его в плотную матрицу. Для этого вам нужно будет предоставить
torch.sparse.FloatTensor
двумерный тензор индексов, тензор значений, а также размер вывода:
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())