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

10 投票
4 回答
9628 浏览
提问于 2025-04-18 04:12

我应该如何在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,但我不能添加,能不能请有权限的好心人帮忙加上这个标签呢?)

4 个回答

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()))

如果没有使用 np.tril,邻接矩阵里会出现2,而不是1,因为每条边会被计算两次。像 gt.num_edges() 这样的函数也会得到错误的结果。

2

这应该是对Tiago的回答的评论,但我没有足够的声望来发表评论。

在最新版本(2.26)的graph_tool中,我觉得缺少一个转置操作。邻接矩阵中的i,j这个位置表示的是从顶点j到顶点i的边的权重,所以应该是

g.add_edge_list(transpose(transpose(adj).nonzero()))
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
13

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()))

撰写回答