Python NetworkX生成边组合的迭代列表

Python NetworkX生成边组合的迭代列表,python,networkx,Python,Networkx,我有一个180x180的邻接矩阵,我正试图生成所有合理的组合,以使用NetworkX 我想按顺序删除部分图形,然后确定新编辑的图形对全局效率的影响 在这个视图中,一组合理的组合是彼此相邻的所有节点集,以及从假设它们彼此相邻到子图的所有可能的子图组合 运行所有组合的蛮力方法太慢,对于任何超过15个的删除序列,运行时间约为21小时。所以我们只想通过观察彼此相邻的组合来解决这个问题 基本上,代码需要执行以下操作: 导入包含二进制邻接矩阵的csv,其中1表示物理连续性(在本例中为大脑) 导入networ

我有一个180x180的邻接矩阵,我正试图生成所有合理的组合,以使用NetworkX

我想按顺序删除部分图形,然后确定新编辑的图形对全局效率的影响

在这个视图中,一组合理的组合是彼此相邻的所有节点集,以及从假设它们彼此相邻到子图的所有可能的子图组合

运行所有组合的蛮力方法太慢,对于任何超过15个的删除序列,运行时间约为21小时。所以我们只想通过观察彼此相邻的组合来解决这个问题

基本上,代码需要执行以下操作:

  • 导入包含二进制邻接矩阵的csv,其中1表示物理连续性(在本例中为大脑)
  • 导入networkx图形
  • 确定相互之间最大路径长度为1的所有组合集……换句话说,如果两个节点或两个节点集在任意一端的间距大于1,则它们将被忽略
  • 为每个合理的组合生成这些节点集的列表
  • 这是基本问题

    假设大脑某个区域的物理空间包括几个大致像这样的区域……假设这些区域是不规则的多边形,镶嵌在一个平面上

    123445

    6789

    10 11

    我们可以将其转化为一个邻接矩阵,其中1表示区域共享一个边界,0表示区域之间没有物理边界

    +--+---------------------------------+
    |  | 1  2  3  4  5  6  7  8  9  10 11|
    +--+---------------------------------+
    |1 | 0  1  0  0  0  1  0  0  0  0  0 |
    |2 | 1  0  1  0  0  0  1  1  0  0  0 |
    |3 | 0  1  0  1  0  0  0  1  1  0  0 |
    |4 | 0  0  1  0  1  0  0  0  1  0  0 |
    |5 | 0  0  0  1  0  0  0  0  1  0  0 |
    |6 | 1  0  0  0  0  0  1  0  0  1  0 |
    |7 | 0  1  0  0  0  1  0  1  0  1  1 |
    |8 | 0  1  1  0  0  0  1  0  1  0  1 |
    |9 | 0  0  1  1  0  0  0  1  0  0  0 |
    |10| 0  0  0  0  0  1  1  0  0  0  1 |
    |11| 0  0  0  0  0  0  1  1  0  1  0 |
    +--+---------------------------------+
    
    基本上,邻接矩阵表示大脑中彼此相邻的部分……我们希望遍历并生成这些节点的分组列表,这些节点从单个节点开始,一直到每个节点的可能组合,但需要注意的是,我们不希望这些组合不与每个节点进行物理接触其他

    例如,这样一个列表将有1,2,…11 还有1+2和7+8等 最终我们会有2+7+8和6+7+8+10,因为所有这些节点都相互接触并形成一个连接的组件 1-11是不允许的,因为他们不共享边界;4+5+10也是不允许的,因为他们不接触边界

    这一点很重要的原因是,我们是脑外科医生,我们以删除部分图形为生…即大脑图形…但你永远不会删除彼此不相邻的节点…我们试图使用图形来定义我们在手术中可以走多远…因此我们需要使用python来生成所有可能的节点删除组合这在现实世界中是有意义的……二进制邻接矩阵表示物理空间中的现实

    一旦我有了一个节点删除的合理组合列表,我有一个代码,它采用不同的数据帧…将节点和边归零,然后创建一个我们运行效率度量的networkx图…我只需要一种方法来确定所有可能的连续组件集,这样我们就不会运行解剖上不合理的组合

    我想解决这个问题的方法是在networkx中使用某种连续组件函数,但我无法从图形中导出所有可能的连接组件组合

    基本上,代码是这样的

    boundary=pd.read_csv(adjacency.csv)
    G=networkx.from_pandas_adjacency(boundary)
    combo="something to iterate the graph g to create a list of all connected components"
    
    
    for row in combo:
            values = row
            datasafe=pandas.read_csv("connections.csv", index_col=0)
            datasafe.loc[values, :] = 0
    
            datasafe[values] = 0
    
            g=networkx.from_pandas_adjacency(datasafe)
            h=networkx.from_pandas_adjacency(datasafe)
            le=local_efficiency(g)
            LE_list.append(le)
            ge=global_efficiency(h)
            GE_list.append(ge)
    output=pandas.DataFrame(list(zip(combo, GE_list,LE_list)))
    output.to_csv('multi.csv',index=None)
    
    请注意,我们使用一个csv来确定列表,并在不同的csv上使用该列表


    提前感谢…这是您正在帮助解决的一个重要问题,它将拯救生命

    连接组件的正确命名是(不要弄乱真实名称)。你的问题被称为
    networkx
    有几种算法可用于解决此问题:

    您的问题可以通过以下功能解决:

    请注意,此函数返回所有可能的团,长度也为1和2(即每个节点和每条边),因此您应该过滤1-2长度的团。例如,对于图形,此函数返回:

    list(nx.enumerate_all_cliques(G))
    
    [[0],
     [1],
     [2],
     [3],
     [4],
     [5],
     [6],
     [7],
     [8],
     [9],
     [10],
     [0, 1],
     [0, 5],
     [1, 2],
     [1, 6],
     [1, 7],
     [2, 3],
     [2, 7],
     [2, 8],
     [3, 4],
     [3, 8],
     [4, 8],
     [5, 6],
     [5, 9],
     [6, 7],
     [6, 9],
     [6, 10],
     [7, 8],
     [7, 10],
     [9, 10],
     [1, 2, 7],
     [1, 6, 7],
     [2, 3, 8],
     [2, 7, 8],
     [3, 4, 8],
     [5, 6, 9],
     [6, 7, 10],
     [6, 9, 10]]
    
    但如果我们过滤掉所有无用的派系,我们会得到:

    list(filter(lambda x: len(x) > 2, nx.enumerate_all_cliques(G)))
    
    [[1, 2, 7],
     [1, 6, 7],
     [2, 3, 8],
     [2, 7, 8],
     [3, 4, 8],
     [5, 6, 9],
     [6, 7, 10],
     [6, 9, 10]]
    

    那么,您想要一个相互直接连接的所有节点的列表吗?请提供您的数据和代码的最小示例。请提供最小示例,即一小段数据(输入)和预期输出。请提供您代码中的相关部分。我编辑了问题以包含我们需要的示例。如果您以后需要帮助,您可以通过
    vurmux@gmail.com
    电子邮件或电报中的
    t.me/vurmux
    。我很乐意帮助你!