Создание взвешенного графика из матрицы смежности в graph-tool, интерфейс python

как создать график с помощью graph-tool в python из матрицы смежности? Предположим, у нас есть adj матрица как матрица смежности.

то, что я делаю сейчас, таково:

        g = graph_tool.Graph(directed = False)
        g.add_vertex(len(adj))
        edge_weights = g.new_edge_property('double')
        for i in range(adj.shape[0]):
            for j in range(adj.shape[1]):
                if i > j and adj[i,j] != 0:
                    e = g.add_edge(i, j)
                    edge_weights[e] = adj[i,j]

но это не кажется правильным, у нас есть лучшее решение для этого?

(и я думаю, правильный тег для этого будет graph-tool, но я не могу добавить его, какой-то человек с достаточными привилегиями может сделать тег?)

3 ответов


Graph-tool теперь включает функцию добавления списка ребер к графику. Теперь вы можете, например:

adj = numpy.random.randint(0, 2, (100, 100)) # a random directed graph
g = Graph()
g.add_edge_list(transpose(adj.nonzero()))

grap-tool не предоставляет прямого способа построения графика из матрицы смежности. AFAIK, он использует представление графа списков смежности из библиотеки графов Boost, что может быть причиной этого (хотя, возможно, автор предоставит реализацию для него в будущем).

мне приходилось работать с graph-tool, создавая граф из матрицы смежности, и мой код выглядел очень похожим на ваш - и он не чувствовал это плохо. Если матрица смежности результат некоторых предыдущих расчетов, я не думаю, что вы можете разработать более красивое решение. Однако, если он считывается из файла, вы можете использовать этот код один раз, чтобы прочитать график и сохранить его в каком-то формате, который принимает graph-tool (см. save(), load() и load_graph() на документация graph_tool и раздел ввода-вывода графика быстрого запуска).

кстати, неоспоримый совет. В вашем коде, учитывая, что вы создаете неориентированный график, вы можете избежать прохождения через половину матрицы, изменяя диапазоны j. Предполагая, что adj является квадратной матрицей (которая должна быть, верно?), вы можете сделать следующее:

g = graph_tool.Graph(directed = False)
g.add_vertex(len(adj))
edge_weights = g.new_edge_property('double')
num_vertices = adj.shape[0]
for i in range(num_vertices - 1):
    for j in range(i + 1, num_vertices):
        if adj[i,j] != 0:
            e = g.add_edge(i, j)
            edge_weights[e] = adj[i,j]

Это должен быть комментарий к поле для гольфа, но у меня недостаточно репутации для этого.

для последней версии (2.26) из graph_tool Я считаю, что там отсутствует транспонирование. The i,j запись матрицы смежности обозначает вес ребра из вершины j в вершину i, так и должно быть

g.add_edge_list(transpose(transpose(adj).nonzero()))