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

Я пытаюсь преобразовать разреженную матрицу/список смежности, которая содержит только индексы ненулевых элементов ([[строки], [столбцы]]), в плотную матрицу, содержащую 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)

Или есть альтернативный способ, который лучше?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
3 142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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())

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

joni 12.12.2020 16:04

Другие вопросы по теме