【问题标题】:How to get the list of edge attributes of a Networkx graph如何获取Networkx图的边缘属性列表
【发布时间】:2020-08-27 14:59:53
【问题描述】:

我想知道是否有任何函数可以获取 Networkx 图的节点/边属性列表

函数get_node_attributes/get_edge_attributes在指定属性名称时返回属性值。但我想知道如何获取加权图的属性名称。

【问题讨论】:

    标签: python-3.x networkx


    【解决方案1】:

    Graph.nodesGraph.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']
    

    【讨论】:

    • 您能添加一些命令来提取属性名称吗?可能在所有边缘上使用集合和联合。由于每个边缘都可能具有其他边缘不包含的属性,因此我认为一般来说没有更快的方法可以做到这一点,但如果我们知道所有边缘都相同,我们可以只查看一个边缘的键。
    • 感谢您的回复。我想检查EdgeDataView 中是否存在给定的属性名称,例如weightlength
    • @natasha - 你能假设所有边都具有相同的属性吗? [通常在networkx中,每条边都可能具有其他边没有的属性]
    • 肯定会更新@Natasha Thx 为你的建议乔尔,听起来像要走的路
    • @Joel 是的,我图的所有边都具有相同的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多