10

我应该如何在 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,但我不能添加它,有足够权限的好心人可以制作标签?)

4

3 回答 3

12

Graph-tool 现在包含一个向图形添加边列表的功能。例如,您现在可以执行以下操作:

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()))
于 2014-04-28T15:47:44.890 回答
4

这是 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
于 2019-03-25T13:02:45.373 回答
2

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

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

g.add_edge_list(transpose(transpose(adj).nonzero()))
于 2018-02-10T12:20:43.303 回答