1

我有一个 Graph G1,它有 50 个节点和 100 条边。所有边都被加权。我创建了一个边列表(按预定义的顺序排序,删除具有大值的特定边),它们的索引如下:

Edgelist: [75, 35, 32, 1, ...]

我想以 10 个批次将边添加到不同的图 G2(以节省计算时间),但 add.edges 似乎想要一个顶点对的元组列表。所以,

  1. 如何将上面的 Edge 列表转换为元组列表,例如 [(40,2),(10,1),(10,11),(0,0),...]。我尝试使用 G1.es[edge].tuple 进行循环,但 iGraph 将 [edge] 变量作为属性读取,而如果您只编写 G1.es[75].tuple,它可以正常工作。

  2. 如何从 G1 中查找权重并将它们以 10 个为一组添加到 G2 中?

4

2 回答 2

1
  1. 您必须注意,G1.es使用单个数字进行索引将返回类型对象Edge,而使用数字列表对其进行索引将返回类型对象EdgeSeqEdge对象有一个名为 的属性tuple,但EdgeSeq对象没有,所以这就是为什么G1.es[edgelist].tuple不起作用但是,您可以这样做:

    sorted_tuples = [edge.tuple for edge in G1.es[edgelist]]
    

    您还可以weight直接从EdgeSeq对象中提取属性的值:

    sorted_weights = G1.es[edgelist]["weight"]
    
  2. 在这里你可以利用这样一个事实,如果G2有 M 条边并且你添加了 m 条额外的边,那么这些新边的 ID 将在从 M(包括)到 M+m(不包括)的范围内:

    M = G2.ecount()
    m = len(sorted_tuples)
    G2.add_edges(sorted_tuples)
    G2.es[M:(M+m)] = sorted_weights
    
于 2013-10-16T09:36:18.270 回答
0

1) 图 G1 已经删除了不需要的边。Edgelist 是 G1 的边顺序。

tuple_list=[]
for e in G1.es:
    tuple_list.append(e.tuple)

sorted_tuples=[tuple_list[i] for i in Edgelist]
sorted_weights = [G1.es['weight'][o] for o in Edgelist]

2) 添加边——这可以简单地为 G1 中的所有边循环。下面是前 10 个示例。

edges_to_add=sorted_tuples[0:10]
weights_to_add=sorted_weights[0:10]

G2.add_edges(edges_to_add)

for edge in range(len(edges_to_add)):
    G2.es[G2.get_eid(edges_to_add[edge][0],edges_to_add[edge][1],0)]['weight'] = weights_to_add[edge]

边权重是单独添加的,有点慢,但是在iGraph中似乎没有批量添加边权重的方法

于 2013-10-16T09:14:45.587 回答