使用nx.write_gexf保存带属性的networkx图为.gexf文件报错怎么办
报错原因
- 第一处是低级变量名错误:你代码前半段构造的节点集、边集分别存储在
nodes、edges变量中,但后续添加节点调用的是G.add_nodes_from(n)、遍历边用的是for i in e,n和e属于未定义变量。如果你实际运行时已经修正了该错误,那核心问题出在属性值的类型不符合GEXF格式规范。 - 第二处是属性类型不符合要求:
nx.write_gexf序列化时仅支持字符串、整数、浮点数、布尔值这类基础单值类型作为节点/边属性,不支持列表、数组等容器类型。你代码中节点的attr值是tolist()生成的列表,边的attr值是套了一层列表的浮点数,序列化时内部逻辑尝试解包属性值,碰到浮点类型的非可迭代对象就会触发对应报错。
修复方案
将容器类型的属性值转为字符串,或者拆分为多个单值属性即可正常导出,修改后的参考代码如下:
import numpy as np import networkx as nx nodes = np.random.rand(3, 5) edges = np.corrcoef(nodes) # 节点列表属性转字符串存储 nodes = tuple((i, {'attr': str(nodes[i].tolist())}) for i in range(nodes.shape[0])) # 边属性去掉外层列表,直接存浮点值 edges = tuple(((i, j), edges[i, j]) for i in range(edges.shape[0]) for j in range(edges.shape[1])) G = nx.Graph() G.add_nodes_from(nodes) for (u, v), weight in edges: G.add_edge(u, v, attr=weight) nx.write_gexf(G, "test.gexf")
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

