【问题标题】:Remove weights from networkx graph从 networkx 图中删除权重
【发布时间】:2022-11-23 09:39:29
【问题描述】:

我有一个加权的 Networkx 图 G。我首先想对 G 进行一些带有权重的操作(这就是为什么我不读取输入并设置权重 = 无)然后从 G 中删除它们。使其不加权的最直接方法是什么?

我可以这样做:

G = nx.from_scipy_sparse_array(nx.to_scipy_sparse_array(G,weight=None))

或者循环遍历G.adj字典,设置weights=0,但是这两个选项感觉都太复杂了。就像是:

G = G.drop_weights()

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    可以直接访问 networkx 图的数据结构并删除任何不需要的属性。 最后,您可以做的是定义一个循环遍历字典并删除“weight”属性的函数。

    def drop_weights(G):
        '''Drop the weights from a networkx weighted graph.'''
        for node, edges in nx.to_dict_of_dicts(G).items():
            for edge, attrs in edges.items():
                attrs.pop('weight', None)
    

    以及使用示例:

    import networkx as nx
    
    def drop_weights(G):
        '''Drop the weights from a networkx weighted graph.'''
        for node, edges in nx.to_dict_of_dicts(G).items():
            for edge, attrs in edges.items():
                attrs.pop('weight', None)
    
    G = nx.Graph()
    G.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.375)])
    
    print(nx.is_weighted(G)) # True
    
    F = nx.Graph(G)
    print(nx.is_weighted(F)) # True
    
    # OP's suggestion
    F = nx.from_scipy_sparse_array(nx.to_scipy_sparse_array(G,weight=None))
    print(nx.is_weighted(F)) # True
    
    # Correct solution
    drop_weights(F)
    print(nx.is_weighted(F)) # False
    

    请注意,即使通过nx.to_scipy_sparse_array 重建没有权重的图也是不够的,因为该图是用权重构建的,只有这些被设置为 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多