1

50 個のノードと 100 個のエッジを持つグラフ G1 があります。すべてのエッジが重み付けされます。エッジのリストを作成し (定義済みの順序で並べ替え、大きな値を持つ特定のエッジを削除)、次のようにインデックスを付けました。

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

別のグラフ G2 に (計算時間を節約するために) 10 個のバッチでエッジを追加したいのですが、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でインデックスを付けると type のオブジェクトが返されるのに対し、数値のリストでインデックスを付けるとtype のオブジェクトが返されることに注意する必要がありますEdgeSeqEdgeオブジェクトには という名前のプロパティがありますがtupleEdgeSeqオブジェクトにはありません。そのため、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 に答える