2016-09-18 191 views
0

networkx.Graphオブジェクトnの状態を、後で状態付きのd(n)(副作用あり)の前に比較したいと考えています。networkxグラフをコピーするにはどうすればよいですか?

n.node[0]['attribute']のような変更可能なオブジェクトノード属性があります。これは比較したいものです。明らかに

before = n 
d() 
after = n 
assert id(before.node[0]['attribute']) == id(after.node[0]['attribute']) 

は、自明

ため
before == after 

成功したが、私はbefore=n.copy()を設定した場合、ディープコピーが作られ、そのためid(before.node[0]['attribute']) != id(after.node[0]['attribute'])されます。すべてのノード属性オブジェクトをコピーせずにGraphオブジェクトのコピーを取得するにはどうすればよいですか?

+0

[Networkxのコピーの明確化](http://stackoverflow.com/questions/29854387/networkx-copy-clarification)の可能な複製 – Anaphory

答えて

1

copyメソッドを呼び出すとディープコピーが得られます。新しいグラフのすべての属性は元のグラフのコピーです。コンストラクタ(例:Graph(G))を呼び出すと、グラフ構造がコピーされる浅いコピーが得られますが、データ属性は元のグラフのものを参照します。 copy方法ドキュメント

から

すべてのコピーは、グラフ構造を再現するが、データ属性は、異なる方法で を取り扱うことができます。人々が望むかもしれないグラフ の4つのタイプのコピーがあります。

ディープ・コピー - デフォルトの動作は、グラフ の構造と、すべてのデータ属性およびそれらに含まれるすべてのオブジェクトがコピーされる「ディープ・コピー」です。グラフオブジェクト全体が新しく、 の変更が元のオブジェクトに影響しないようにします。

浅いコピー(with_data = False)の場合、 グラフ構造がコピーされますが、エッジ、ノード、およびグラフの属性ディクショナリ は元のグラフのものを参照します。これにより時間とメモリが節約されますが、1つの グラフ内の属性を変更してもう一方の属性を変更すると混乱する可能性があります。

In [1]: import networkx as nx 

In [2]: G = nx.Graph() 

In [3]: G.add_node(1, color=['red']) 

In [4]: G_deep = G.copy() 

In [5]: G_deep.node[1]['color'].append('blue') 

In [6]: list(G.nodes(data=True)) 
Out[6]: [(1, {'color': ['red']})] 

In [7]: list(G_deep.nodes(data=True)) 
Out[7]: [(1, {'color': ['red', 'blue']})] 

In [8]: G_shallow = nx.Graph(G) 

In [9]: G_shallow.node[1]['color'].append('blue') 

In [10]: list(G.nodes(data=True)) 
Out[10]: [(1, {'color': ['red', 'blue']})] 

In [11]: list(G_shallow.nodes(data=True)) 
Out[11]: [(1, {'color': ['red', 'blue']})] 
+0

これはバージョン2.0以降は真実ではないようです。 – xuhdev

-1

もごnetworkxグラフが...オブジェクトのオブジェクトが含まれている場合は、さえdeepcopyが動作しないことに注意してください。レベルが多すぎるとエラーが返されます。

通常、私はグラフに何が正確に関心があり、それで新しいものを作成すると思います。

関連する問題