如何获取 Networkx 图的边属性列表

7
我想知道是否有函数可以获取Networkx图的节点/边属性列表。
当指定属性名称时,函数get_node_attributes/get_edge_attributes返回属性值。但我想知道如何获取加权图的属性名称。
1个回答

11

无论是Graph.nodes还是Graph.edges都接受一个data参数,如果将其设置为True,我们将得到节点/边缘属性以元组的形式返回为(n, dict[data]),其中第二个术语是包含所有属性的字典。以下是一个示例:

G = nx.Graph()

G.add_node(2, lat=41.793780, long=3.972440)
G.add_node(4, lat=41.151363, long=54.374512)
G.add_node(5, lat=17.164215, long=13.92541)
G.add_node(6, lat=10.173651, long=30.335611)

G.add_edge(2, 4, weight=0.2, length=12)
G.add_edge(5, 6, weight=0.6, length=13)

通过设置data=True,如上所述,我们得到:

G.nodes(data=True)
NodeDataView({2: {'lat': 41.79378, 'long': 3.97244}, 
              4: {'lat': 41.151363, 'long': 54.374512}, 
              5: {'lat': 17.164215, 'long': 13.92541}, 
              6: {'lat': 10.173651, 'long': 30.335611}})

G.edges(data=True)
EdgeDataView([(2, 4, {'weight': 0.2, 'length': 12}), 
              (5, 6, {'weight': 0.6, 'length': 13})])

如果你只想要一个属性名称列表,比如说边的属性,你可以这样做:

from itertools import chain

set(chain.from_iterable(d.keys() for *_, d in G.edges(data=True)))
# {'length', 'weight'}

或者在更简单的情况下,每条边具有相同的属性:

list(list(G.edges(data=True))[0][-1].keys())
# ['weight', 'length']

你能否添加一些命令来提取属性名称?可能需要使用一个集合和对所有边进行并集操作。由于每个边缘可能具有其他边缘中未包含的属性,因此我认为通常情况下没有更快的方法来执行此操作,但是如果我们知道所有边缘都是相同的,我们可以只查看一个边缘的键。 - Joel
感谢您的回复。我想检查给定的属性名称,比如 weightlength 是否存在于 EdgeDataView 中。 - Natasha
@natasha - 你能假设所有的边都有相同的属性吗?[一般来说,在networkx中,每条边都可以具有其他边没有的属性] - Joel
肯定会更新 @Natasha 感谢你的建议 Joel,听起来是正确的做法。 - yatu
@Joel 是的,我的图的所有边都具有相同的属性。 - Natasha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接