

NetworkXのKernighan-linアルゴリズムを用いて手持ちのネットワーク  
データの分割を行ったのですが、以下のエラーで躓いてしまいました。  
アドバイス頂けますと幸いです。

[code]

    IndexError Traceback (most recent call last) in () 17 for c in init_partition: 18 for n in c: ---> 19 color_map_i[n]=colors[counter] 20 counter=counter+1 21
    
    IndexError: list assignment index out of range
    
[/code]

コードは以下の通りです。

[code]

    G=nx.read_edgelist("200224_04_act.prn",nodetype=int)
    
    colors=["red","blue","green"]
    pos=nx.spring_layout(G)
    
    
    init_nodes=np.array_split(G.nodes(),2)
    init_partition=[set(init_nodes[0]),set(init_nodes[1])]
    print(init_partition)
    
    
    from networkx.algorithms.community import kernighan_lin_bisection
    
    color_map_i=["black"]*nx.number_of_nodes(G)
    print(color_map_i)
    counter=0
    for c in init_partition:
        for n in c:
            color_map_i[n]=colors[counter]
        counter=counter+1
    
    print(color_map_i)
    
    
    nx.draw_networkx_edges(G,pos)
    nx.draw_networkx_nodes(G,pos,node_color=color_map_i)
    nx.draw_networkx_labels(G,pos)
    
    plt.axis("off")
    plt.show()
    
    lst_b=kernighan_lin_bisection(G,partition=init_partition)
    color_map_b=["black"]*nx.number_of_nodes(G)
    
    counter=0
    for c in lst_b:
        for n in c:
            color_map_b[n]=colors[counter]
        counter=counter+1
    
    nx.draw_networkx_edges(G,pos)
    nx.draw_networkx_nodes(G,pos,node_color=color_map_b)
    nx.draw_networkx_labels(G,pos)
    plt.axis("off")
    plt.show()
    
[/code]

元データ "200224_04_act.prn" は以下の通りですが、当投稿の文字数制限により実際より数が小さいです。（ノード数は実際には2000程度）

[code]

       1     415
       2     415
       3     415
       3    1350
       4    1351
       5    1352
       6     383
       7     993
       8    1353
       9     887
      10     887
      11     887
      12     887
      13     887
      14    1185
      15    1185
      16    1185
      17    1185
      18    1185
      19    1146
      20    1146
      21    1146
      22    1146
      21     776
      23     776
      24     707
      25     707
      26     707
      27     707
      28     707
      29     754
      21     754
      30     754
      31     754
      32     754
      33     778
      34     778
      35     778
      36     778
      37     778
      38     859
      39     859
      40    1354
      41     563
      42     563
      43     563
      44     563
      45     563
      46    1209
      47    1209
      48    1209
      49    1209
      50    1209
      51     715
      52     715
      53     715
      54     715
      55     715
      56    1048
      57    1048
      58    1047
      59    1047
      60    1047
    
[/code]


CC BY-SA 4.0
2020-03-01T15:41:38.763
63478
2021-02-10T02:11:07.183
2021-02-10T02:11:07.183
3060
38030
question
python networkx
NetworkXのネットワーク分析エラー


この部分に問題があります。

[code]

    counter=0
    for c in init_partition:
        for n in c:
            color_map_i[n]=colors[counter]
        counter=counter+1
    
[/code]

`n` には頂点の名前が入っていますが、 200224_04_act.prn を見る限りこれは 1 から始まっているようです。しかし Python
の配列の添え字は 0 から始まっているため、`color_map_i[n]` と書くとひとつずれます。このため最大の番号の頂点の名前が `n`
に入っている場合、`color_map_i[n]` は存在せず `index out of range` エラーに繋がります。

解決法として：

  * 200224_04_act.prn の頂点番号を 0 から始める、または、
  * `color_map_i[n-1]` のようにすべての箇所でひとつずらす、または、
  * `color_map_i` の長さを `nx.number_of_nodes(G) + 1` にし、添え字番号と頂点番号が対応するようにする

が考えられます。

補足：ところで `counter` はわざわざ自分でインクリメントする必要はなくて、`for counter, c in
enumerate(init_partition):` と書くと勝手に添え字を代入してくれます。


CC BY-SA 4.0
2020-03-02T10:18:00.507
63494
2020-03-02T10:18:00.507
19110
63478
answer