【问题标题】:Iterate variable for every node | Node Connectivity in Python Graph为每个节点迭代变量 | Python 图中的节点连接性
【发布时间】:2021-05-26 21:29:43
【问题描述】:

我想在图中找到节点 1 和其余节点之间的节点连通性。输入文本文件格式如下:

1 2 1
1 35 1
8 37 1

以此类推,共 167 行。第一列代表源节点,第二列代表目的节点,最后一列代表边的权重。

我正在尝试从输入文件中读取源节点、目标节点并在它们之间形成一条边。然后我需要确定它是否是一个连接的网络(只有图形的一个组件,没有子组件)。这是代码

from numpy import*
import networkx as nx
G=nx.empty_graph()

for row in file('out40.txt'):
    row = row.split()
    src = row[0]
    dest = row[1]
    #print src
    G.add_edge(src, dest)
    print src, dest

for i in range(2, 41):
    if nx.bidirectional_dijkstra(G, 1, i): print "path exists from 1 to ", i

使用手动添加边

G.add_edge(1, 2)

工作但很乏味,不适合像我这样的大型输入文件。当我手动添加边时,if 循环条件有效,但对上述代码抛出以下错误:

in neighbors_iter
raise NetworkXError("The node %s is not in the graph."%(n,))
networkx.exception.NetworkXError: The node 2 is not in the graph.

任何帮助将不胜感激!

【问题讨论】:

    标签: python graph networkx


    【解决方案1】:

    在您的代码中,您将添加节点 "1""2" 等等(因为从文件中读取会为您提供字符串,除非您明确转换它们)。

    但是,您随后尝试引用节点 12。我猜networkx 不认为2 == "2"

    尝试更改此设置...

    G.add_edge(src, dest)
    

    到这里:

    G.add_edge(int(src), int(dest))
    

    【讨论】:

    • @bhanu:如果这对您来说是正确的解决方案,请将其标记为这样(并对有用的答案进行投票)
    • @Rabarberski 我做到了!谢谢。
    【解决方案2】:

    不确定这是否适合您,但您是否知道 networkx 对多种图形文本格式的内置支持

    edge list format 似乎非常适合您的情况。具体来说,以下方法无需自定义代码即可读取您的输入文件:

    G = nx.read_weighted_edgelist(filename)
    

    如果您想移除权重(因为您不需要它们),您可以随后执行以下操作:

    for e in G.edges_iter(data=True):
        e[2].clear()                   #[2] is the 3rd element of the tuple, which 
                                       #contains the dictionary with edge attributes
    

    【讨论】:

    • 谢谢,我还没看。我将对此进行探索。
    • 我已经编辑了我的答案,read_weighted_edgelist() 方法正是你所需要的。
    • 太棒了!我想我将来在使用加权边缘时会使用它。目前,使用未加权的边缘。谢谢!
    • 谢谢你,这真的很有帮助!
    【解决方案3】:

    来自Networkxdocumentation

    for row in file('out40.txt'):
        row = row.split()
        src = row[0]
        dest = row[1]
        G.add_nodes_from([src, dest])
        #print src
        G.add_edge(src, dest)
        print src, dest
    

    错误消息显示图形 G 没有您要在其间创建边的节点。

    【讨论】:

    • Amber 回答了!我没有将它类型转换为整数。谢谢!
    【解决方案4】:

    您还可以使用“is_connected()”来简化此操作。例如

    $ cat disconnected.edgelist
    1 2 1
    2 3 1
    4 5 1
    $ cat connected.edgelist 
    1 2 1
    2 3 1
    3 4 1
    $ ipython
    
    In [1]: import networkx as nx
    
    In [2]: print(nx.is_connected(nx.read_weighted_edgelist('disconnected.edgelist')))
    False
    
    In [3]: print(nx.is_connected(nx.read_weighted_edgelist('connected.edgelist')))
    True
    

    【讨论】:

    • 感谢@aric,我正在使用“nx.number_connected_components(G)”来查找图表是否已连接。但是,我想知道是否有一种方法可以连接图形的两个断开连接的组件。你知道任何方法吗?谢谢。
    【解决方案5】:

    另一种选择是将文件加载为 pandas 数据框,然后使用iterrows 进行迭代:

    import pandas as pd
    import networkx as nx
    
    cols = ["src", "des", "wei"]
    df = pd.read_csv('out40.txt', sep=" ", header=None, names=cols)
    G = nx.empty_graph()
    
    for index, row in df.iterrows():
        G.add_edge(row["src"], row["des"])
    

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多