从graph-tool,python接口中的邻接矩阵创建加权图

时间:2014-04-25 09:02:10

标签: python graph graph-tool

如何在python中使用graph-tool在邻接矩阵中创建图形? 假设我们有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 个答案:

答案 0 :(得分:9)

图表工具现在包含一个向图表添加边缘列表的功能。你现在可以做,例如:

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

答案 1 :(得分:1)

这应该是对Tiago's answer的评论,但我没有足够的声誉。

对于graph_tool的最新版本(2.26),我相信那里缺少转置。邻接矩阵的i,j条目表示从顶点j到顶点i的边的权重,因此它应该是

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

答案 2 :(得分:0)

这是Tiago对加权图的答案的扩展:

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