Как преобразовать разреженную матрицу смежности в плотную?

#python #pytorch #adjacency-matrix

#python #pytorch #матрица смежности #pytorch-геометрический

Вопрос:

Я пытаюсь преобразовать разреженную матрицу смежности / список, который содержит только индексы ненулевых элементов ([[строки], [столбцы]]) в плотную матрицу, которая содержит 1 в индексах и в противном случае 0. Я нашел решение, используя to_dense_adj из Pytorch geometric (Документация). Но это не совсем то, что я хочу, поскольку форма плотной матрицы не соответствует ожиданиям. Вот пример:

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

Таким образом, плотная матрица должна иметь размер 5×3 (второй массив «хранит» столбцы; с ненулевыми элементами в (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 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())
 

Комментарии:

1. Есть ли подходящий способ преобразовать плотную матрицу смежности обратно в ее разреженное представление? Я попробовал это, изменив форму и «dense_to_sparse». К сожалению, разреженная матрица тогда [[0, 1, 2, 3, 4], [0, 1, 2, 1, 0]] вместо того , чтобы [[0, 1, 2, 1, 0], [0, 1, 2, 3, 4]]. Я не уверен, но я думаю, что это из-за размера вывода. Но только изменение размеров не работает.