2017-03-20 30 views
2

私はnetworkxグラフのノードにnumpy-arrayを付けました。グラフをgexf形式でディスクに保存する方法は? (ちょうど中間のものとしてのnumpyベクトルなしで...)networkxノード属性を削除する

def create(): 
    G = nx.Graph() 
    for i in range(256): 
     G.add_node(i, vector=np.arange(20)) 
    for i in range(1,20): 
     for j in range(1,256, 10): 
      G.add_edge(i,j) 

    temp = tempfile.mktemp(suffix=".gexf") 
    print("dumping G = (V: %s, E: %s) to disk %s" 
     % (len(G.nodes()), len(G.edges()), temp)) 
    nx.write_gexf(G, temp) 

しかし、これは壊れます。私はPythonには新しいですが、ndarrayはシリアライズ可能ではないようです。では、networkxにそのノード属性を無視するように指示する方法はありますか?

File "...lib\site-packages\networkx\readwrite\gexf.py", line 430, in add_attributes 
    attr_id = self.get_attr_id(make_str(k), self.xml_type[val_type], 
KeyError: <type 'numpy.ndarray'> 

答えて

2

あなたのグラフオブジェクトをシリアル化するために、ネイティブpickle、またはHDF5のためh5pyのようなライブラリを使用してください。たとえば、あなたが行うことができます:

import pickle 

with open("pickle_file", "wb") as f: 
    pickle.dump(create(), f) 

漬けグラフは、バックのPythonにロードすることができます。

with open("pickle_file", "rb") as f: 
    G = pickle.load(f) 
+0

オムが、トン私はゲイファイで読み込めません。 – helt

+0

あなたはあなたの質問にそれを指定していません;) – harryscholes

+0

私は質問を更新しました。そういうことを指摘してくれてありがとう。 – helt

1

私はデータ項目からプロパティ「ベクター」を削除することによって、これを解決:

for (n,d) in G.nodes(data=True): 
    del d["vector"] 

フルMWE:

def create(): 
    G = nx.Graph() 
    for i in range(256): 
     G.add_node(i, vector=np.arange(20)) 
    for i in range(1,20): 
     for j in range(1,256, 10): 
      G.add_edge(i,j) 

    temp = tempfile.mktemp(suffix=".gexf") 
    print("dumping G = (V: %s, E: %s) to disk %s" 
     % (len(G.nodes()), len(G.edges()), temp)) 
    for (n,d) in G.nodes(data=True): 
     del d["vector"] 
    nx.write_gexf(G, temp) 
関連する問題