我有一个加权网络 gml 文件,但在 jupyter 笔记本中成功读取它时遇到问题。我的文件的一部分如下所示:
graph
[
node
[
id 1
]
node
[
id 2
]
(..some nodes and edges)
edge
[
source 34
target 24
value 4.00
]
edge
[
source 11
target 6
value 3.00
]
]
我的文件可以通过以下方式下载: 访问 https://area51.stackexchange.com/https://gawron.sdsu.edu/python_for_ss/course_core/book_draft/Social_Networks/Networkx.html 9.2.6
我用来读取文件的代码是:
import networkx as nx
kn2 = nx.read_gml('/Users/kate/Desktop/karate_club/weighted_karate.gml')
和错误:
NetworkXError: node #0 has no 'label' attribute
我除了用标签和重量成功读取文件。
read_gml自动重命名解析的节点:
label (string, optional)
– 如果不None
,则解析的节点将根据label
指示的节点属性重命名。默认值:‘label’
。
您可以将label
设置为'id'
以便根据 .gml 文件中id
字段设置节点 ID,以便read_gml
节点 ID:
import networkx as nx
kn2 = nx.read_gml('karate.gml', label='id')
print(kn2.edges)
[(1, 32), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), ...]
编辑1:看起来这本书有点过时了。对于稳定版本read_gml
如果 .gml 文件中有边缘重复项,则需要在 .gml 文件中有一个multigraph 1
行。您应该添加它:
Creator "Jean Mark Gawron on Sunday, 15. December 2013 02:40PM" graph [ multigraph 1 <------------------ HERE node [ id 1 ] node [ id 2 ] ...
然后,您可以像这样访问边的值:
kn2.edges.data('value')
或者像书中那样对它们进行排序:
all_edges = sorted(
kn2.edges(),
key=lambda x: kn2.get_edge_data(*x)[0]['value'],
reverse=True
)