Create a weighted graph from an adjacency matrix in graph-tool, python interface
Asked Answered
L

4

10

How should I create a graph using graph-tool in python, out of an adjacency matrix? Assume we have adj matrix as the adjacency matrix.

What I do now is like this:

        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]

But it doesn't feel right, do we have any better solution for this?

(and I guess a proper tag for this would be graph-tool, but I can't add it, some kind person with enough privileges could make the tag?)

Loupe answered 25/4, 2014 at 9:2 Comment(0)
D
13

Graph-tool now includes a function to add a list of edges to the graph. You can now do, for instance:

import graph_tool as gt
import numpy as np
g = gt.Graph(directed=False)
adj = np.random.randint(0, 2, (100, 100))
g.add_edge_list(np.transpose(adj.nonzero()))
Dancette answered 28/4, 2014 at 15:47 Comment(2)
And for those who wonder, transpose() is numpy.transpose()Frippery
The OP explicitly asks for a weighted graphLinette
G
4

this is the extension of Tiago's answer for the weighted graph:

adj = numpy.random.randint(0, 10, (100, 100)) # a random directed graph
idx = adj.nonzero()
weights = adj[idx]
g = Graph()
g.add_edge_list(transpose(idx)))

#add weights as an edge propetyMap
ew = g.new_edge_property("double")
ew.a = weights 
g.ep['edge_weight'] = ew
Ginn answered 25/3, 2019 at 13:2 Comment(0)
M
2

This should be a comment to Tiago's answer, but I don't have enough reputation for that.

For the latest version (2.26) of graph_tool I believe there is a missing transpose there. The i,j entry of the adjacency matrix denotes the weight of the edge going from vertex j to vertex i, so it should be

g.add_edge_list(transpose(transpose(adj).nonzero()))
Magen answered 10/2, 2018 at 12:20 Comment(0)
M
0
import numpy as np
import graph_tool.all as gt

g = gt.Graph(directed=False)
adj = np.tril(adj)
g.add_edge_list(np.transpose(adj.nonzero()))

Without np.tril the adjacency matrix will contain entries with 2s instead one 1s because every edge is counted twice. Things like gt.num_edges() will be incorrect too.

Measure answered 3/12, 2022 at 18:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.