首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Networkx无法导出到具有属性的graphml

Python Networkx无法导出到具有属性的graphml
EN

Stack Overflow用户
提问于 2014-01-14 03:00:07
回答 2查看 3.9K关注 0票数 1

在将networkx图转换为graphml时遇到以下问题(无法在此处发布所有代码,但这里是要点)。NetworkX版本为1.6.2

我有一个名为G的网络x有向图

代码语言:javascript
复制
G = nx.DiGraph()

用作者列表中的加权边填充它,格式为(AuthorA,AuthorB,Weight)

代码语言:javascript
复制
G.add_weighted_edges_from(author_list)

我可以在这里导出graphml,它工作得很好

代码语言:javascript
复制
nx.write_graphml(G, 'test.graphml')

然后我计算图形上的pagerank

代码语言:javascript
复制
graph_metric = nx.pagerank_numpy(G, weight='weight')

然后将属性添加到图中的节点

代码语言:javascript
复制
nx.set_node_attributes(G, 'pagerank', graph_metric)

如果我遍历这个图,我可以打印出节点名称和pagerank

代码语言:javascript
复制
for n.d in G.nodes_iter(data=True):
     print n, d

AuthorA {u‘’pagerank‘:0.0076688948270074164} ... ... ...

但是,如果在更新属性之后,我试图从图中创建一个graphml,我会得到以下错误:

代码语言:javascript
复制
File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 111, in generate_graphml

writer.add_graph_element(G)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 305, in add_graph_element

self.add_nodes(G,graph_element)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 262, in add_nodes

self.add_attributes("node", node_element, data, default)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 255, in add_attributes

scope=scope, default=default_value)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 242, in add_data

raise nx.NetworkXError('GraphML writer does not support '

NetworkXError: GraphML writer does not support dict types as data values.

有什么想法?

EN

回答 2

Stack Overflow用户

发布于 2014-01-14 03:16:55

好吧,它确实告诉你-你不能把一个字典作为一个graphml属性-它们需要要么是数值类型,要么是字符串,在大多数情况下。

这不是答案,但在这里更容易放入代码。查找“坏”节点:

代码语言:javascript
复制
for node in G.node:
    for attrib in G.node[node]:
        if type(G.node[node][attrib]) == dict:
            print node
票数 1
EN

Stack Overflow用户

发布于 2021-05-05 20:09:37

我可以用pagerank_numpy()数据保存GraphMl:

我将nx.set_node_attributes(G, 'pagerank', graph_metric)更改为nx.set_node_attributes(G, graph_metric, 'pagerank') as per the function definition in networkx doc

我已经创建了一个带有权重的图形,计算了nx.pagerank_numpy(),并用PageRank值保存了GraphMl

代码:

代码语言:javascript
复制
import networkx as nx

G = nx.DiGraph()

G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'G'), ('B', 'F'), ('C', 'G')], weight = 2)
G.add_edges_from([('D', 'B'), ('E', 'C'), ('E', 'F'),('B', 'H')], weight = 3)

graph_metric = nx.pagerank_numpy(G, weight='weight')
nx.set_node_attributes(G, graph_metric, 'pagerank')
nx.write_graphml(G, 'test.graphml')

GraphMl输出:

代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <key id="d1" for="edge" attr.name="weight" attr.type="int" />
  <key id="d0" for="node" attr.name="pagerank" attr.type="double" />
  <graph edgedefault="directed">
    <node id="A">
      <data key="d0">0.07114273010226772</data>
    </node>
    <node id="B">
      <data key="d0">0.16184971098265896</data>
    </node>
    <node id="C">
      <data key="d0">0.13161405068919527</data>
    </node>
    <node id="G">
      <data key="d0">0.22232103156958644</data>
    </node>
    <node id="F">
      <data key="d0">0.14068474877723428</data>
    </node>
    <node id="D">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="E">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="H">
      <data key="d0">0.13010226767452204</data>
    </node>
    <edge source="A" target="B">
      <data key="d1">2</data>
    </edge>
    <edge source="A" target="C">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="F">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="H">
      <data key="d1">3</data>
    </edge>
    <edge source="C" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="D" target="B">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="C">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="F">
      <data key="d1">3</data>
    </edge>
  </graph>
</graphml>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21099194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档