使用add_edge_list()方法创建图形的最佳方法是什么?

时间:2019-05-08 12:17:07

标签: python python-3.x graph networkx graph-tool

我正在尝试通过graph-tool库(靠近10 ^ 6-10 ^ 7顶点)创建大型图形,并用顶点名称填充顶点属性或使用名称而不是顶点索引。我有:

  1. 名称列表:

    ['50', '56', '568']
    
  2. 一组边,但不是顶点索引,而是它们的名称:

    edge_list = {frozenset({'568', '56'}), frozenset({'56', '50'}), frozenset({'50', '568'})}
    

由于add_edge_list()允许创建顶点(如果它们在图中没有这样的顶点)。我正在尝试使用它来填充一个空图。它可以正常工作,但是当我尝试通过名称获取顶点时,出现一个错误,即没有具有该索引的顶点。

这是我程序的代码:

g = grt.Graph(directed=False)
edge_list = {frozenset({'568', '56'}), frozenset({'56', '50'}), frozenset({'50', '568'})}
ids = ['50', '56', '568']
g.add_edge_list(edge_list, hashed=True, string_vals=True)
print(g.vertex('50'))

print(g.vertex('50'))的错误消息:

ValueError: Invalid vertex index: 50

我要创建图形:

  1. 仅使用edge_list
  2. 可以通过名称快速访问顶点;
  3. 按时间最佳(如果可能的话,还有RAM)。

有什么好办法吗?

编辑: 当前代码:

g = grt.Graph(directed=False)
g.add_vertex(len(ids))
vprop = g.new_vertex_property("string", vals=ids)
g.vp.user_id = vprop  
for vert1, vert2 in edges_list:
    g.add_edge(g.vertex(ids_dict[vert1]), g.vertex(ids_dict[vert2]))

1 个答案:

答案 0 :(得分:2)

如果您有一个具有10 ^ 6-10 ^ 7个顶点的密集图(是一些医学数据还是社交图?它可以改变所有内容),则不应使用{{1} },因为它是用纯Python编写的,因此比networkxgraph-tool慢10-100倍。对于您的情况,我建议您使用igraph。这是最快的(〜graph-tool)Python图形处理库。

igraph的行为不同于graph-tool。创建networkx节点时,其标识符就是您在节点构造函数中编写的内容,因此可以通过其ID获取该节点。在graph-tool中,每个顶点ID是1到GRAPH_SIZE之间的整数:

  

图中的每个顶点都有一个唯一索引,该索引始终在0到N-1之间,其中N是顶点数。可以通过使用图形的vertex_index属性(这是一个属性映射,请参阅属性映射)或将顶点描述符转换为int来获得此索引。

关于图形,顶点或边的所有其他信息都存储在property maps中。当您将networkx.add_edge_list()一起使用时,新的属性映射将作为hashed=True的结果返回。因此,在您的情况下,应该这样处理顶点:

.add_edge_list()

如果要根据ID获取顶点,则应手动构造映射字典(好吧,我不是# Create graph g = grt.Graph(directed=False) # Create edge list # Why frozensets? You don't really need them. You can use ordinary sets or tuples edge_list = { frozenset({'568', '56'}), frozenset({'56', '50'}), frozenset({'50', '568'}) } # Write returned PropertyMap to a variable! vertex_ids = g.add_edge_list(edge_list, hashed=True, string_vals=True) g.vertex(1) Out [...]: <Vertex object with index '1' at 0x7f3b5edde4b0> vertex_ids[1] Out [...]: '56' 专家,但我找不到简单的解决方案):

graph-tool

因此您可以轻松获得顶点索引:

very_important_mapping_dict = {vertex_ids[i]: i for i in range(g.num_vertices())}