0

これがマージなのか、2 つの個別のインポートなのか、それとも完全に再考する必要があるのか​​ はわかりません。最初にエッジ、次にノードデータの 2 段階のインポートを常に行っていた gephi で遊んだ後、もともと igraph を使い始めました。これは igraph にとって賢明な戦略ですか?

そのため、最近のヘルプのおかげで、次のようなエッジ リストをインポートしました。

123123 321321 1
222222 333333 2
123123 333333 3
222222 321321 4

...インポートコマンドで

import igraph
g = igraph.Graph.Read_Ncol('edgelist.txt')

このエッジリスト インポートによって生成されたノードに属性を追加したいと考えています。これらは次のようなものになります...

123123 "color:red" "community:1"
222222 "color:blue" "community:2"
321321 "color:red" "community:1"
333333 "color:red" "community:2"

このデータを現在のグラフに追加するにはどうすればよいですか? 洗練されたエッジリストをインポートするためのフォーマットはたくさんありますが、ノードリストのフォーマットはありません。私は何が欠けていますか?ノードデータを適切なノードに自動的に追加する機能はありませんか?

そうでない場合、誰かがノード データを既存のグラフに適切に入力する簡単な方法を推奨できますか?

私の本能は次のようなものでした...

[g.vs["color"] = x for x in node_list.color if g.vs["name"] == node_list.name]
[g.vs["community"] = x for x in node_list.community if g.vs["name"] == node_list.name]

しかし、これは非常に不器用に見えます。

4

1 に答える 1

2

まあ、あなたは正しい道を進んでいます。はい、それは少し厄介になるでしょう。igraph はそのコアの奥深くは単純な C ライブラリであり、C では名前 (頂点とエッジの名前) ではなく数字 (頂点とエッジの ID) を使用する方がはるかに簡単であるため、扱いにくいです。そのため、igraph は、名前の代わりにゼロから上の整数を使用して頂点とエッジを参照し、その名前から頂点自体に到達するために 1 つの余分なフープをジャンプする必要があります。

私はおそらく次のことをするでしょう:

  1. を使用してエッジ リストを読み取りGraph.Read_Ncolます。(あなたはすでにそれを行っています)。
  2. 頂点名を ID にマップする辞書を作成します。

    >>> id_mapping = dict((v, k) for k, v in g.vs["name"])
    
  3. 属性ファイルを に読み込みますnode_listnode_list.nameこれにより、頂点名のリストとnode_list.color、対応する色を含むリストが得られると思います。その後、次のことができます。

    >>> for name, color in izip(node_list.name, node_list.color):
    ...     g.vs[id_mapping[name]]["color"] = color
    

3 番目のステップの別の方法は、 を使用することg.vs.find(name)です。これによりVertex、指定された名前の頂点を参照するオブジェクトが得られます。その後、この頂点にアトリビュートを割り当てることができます。例えば:

>>> for name, color in izip(node_list.name, node_list.color):
...     g.vs.find(name)["color"] = color

この場合、 は必要ありませんid_mappingname実際、igraph は頂点属性のみのバックグラウンドで名前から ID へのマッピングを維持し、g.vs.findこのマッピングを利用します。id_mappingではなく、頂点の一意のキーとして別の頂点属性を使用する場合は、 ベースのアプローチがより便利ですname

于 2013-01-24T20:56:38.850 に答える