【问题标题】:Random Graph Python networkx Read file and plot graph随机图 Python networkx 读取文件并绘制图形
【发布时间】:2014-07-08 12:35:44
【问题描述】:

我正在尝试读取一个包含 10000 多个条目和 3 列的文件。第 1 列和第 2 列是节点,第 3 列是以秒为单位的时间。我最初试图用数据绘制一个随机图 G=(n,m),然后想在两个相对节点之间分配第三列的数据。之后,我必须计算该图中的节点、边、桥的数量。 我在这里失去了一些东西。如果我应该先绘制图表然后进行计数,或者我应该计数然后绘制图表。任何建议都会有所帮助。

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import scipy as sy
import itertools as it
import time

with open("File.txt") as f:
     data = f.read()
     data = data.split('\n')
node_one = [row[0] for row in data]
node_two = [row[1] for row in data]
def draw_graph(graph): 
    G = nx.Graph()
    #G.add_edges_from([(node_one[0], node_two[1]])
    #G.add_edges_from(node_one, node_two)
    G.number_of_nodes()
    G.number_of_edges() 
    G.neighbors(edge[0], edge[1])
    n = nx.number_connected_components(G)
    bridge_count = 0
    for edge in G.edges():
        if len(set(G.neighbors(edge[0])) & set(G.neighbors(edge[1]))) == 0:         
           G.remove_edge(edge[0], edge[1])          
             if nx.number_connected_components(G) > n:                  
                print edge, 'is a bridge'
                bridge_count += 1
                G.add_edge(edge[0], edge[1])
print number_of_nodes()

print number_edges()

print neighbors()

print bridge_count

我在这里遇到的错误是 回溯(最近一次通话最后): 文件“edge_bridge.py”,第 13 行,在

node_one = [row[0] for row in data]

IndexError: 字符串索引超出范围

【问题讨论】:

    标签: python random graph matplotlib networkx


    【解决方案1】:
    G.number_of_nodes()
    G.number_of_edges()
    

    可以为您计算,它们可以单独完成而不是绘制图表。 可以按照指令here添加边缘属性。

    您在这里对桥的定义是什么,即两个没有共同邻居的节点之间的边?为此,您可以遍历每条边并寻找两个端节点的共同邻居。如果没有共同的邻居,那就是搭桥关系。

    如果桥的定义是一条边,当删除时,会产生更多未连接的组件,如 cmets 中的 @mdml 所述。您可以进行与上述相同的迭代,再添加一个步骤。当没有共同邻居时,从图中删除边,计算连通分量的数量,如果数量增加,那就是一座桥。然后记住在迭代到下一条边之前将边放回图中。 类似于下面的东西

    G = nx.Graph()
    G.add_edges_from([(1,2), (1,3), (2,3), (2,4), (2,5), (5,6), (6,7), (5,7)])
    n = nx.number_connected_components(G)
    bridge_count = 0
    for edge in G.edges():
        if len(set(G.neighbors(edge[0])) & set(G.neighbors(edge[1]))) == 0:
            G.remove_edge(edge[0], edge[1])
            if nx.number_connected_components(G) > n:
                print edge, 'is a bridge'
                bridge_count += 1
            G.add_edge(edge[0], edge[1])
    print bridge_count
    

    输出是

    (2, 4) is a bridge
    (2, 5) is a bridge
    2
    

    【讨论】:

    • 在图论中,桥是一条边,当移除它时会增加图中连接组件的数量(请参阅wiki)。我认为这就是 OP 所说的。
    • 非常感谢.. 但我面临的问题是从文件中加载数据。这是一个非常非常大的文件,大约有 1000000 多行,您能建议任何与此相关的内容吗?
    • 粘贴几行数据文件?看起来 row.split(' ') 不起作用,或者至少有些行没有拆分为多个项目。 try: (your thing) except: (print out the row)怎么样,看看是什么原因导致的错误
    • 先试试这个with open("File.txt") as f: data = f.read() data = data.split('\n') for row in data: print row
    • G.neighbors(n) 返回 n 的邻居节点列表。如果你想要两个节点的邻居,你可以做set(G.neighbors(n1))set(G.neighbors(n2)),然后你可以对这两个集合进行并集、交集或任何操作来得到你想要的邻居。看看这个documentation 的python 集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2012-03-17
    • 2013-10-13
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多