Indexing 重新索引网络(图形)边缘列表

Indexing 重新索引网络(图形)边缘列表,indexing,graph,graph-algorithm,networkx,pseudocode,Indexing,Graph,Graph Algorithm,Networkx,Pseudocode,我这里的问题与语言无关,所以一个伪代码答案就可以了 假设我们有一个表示图的边列表,这个边列表是经典的二维矩阵形式。我们还假设,在这个边列表中,节点不是以连续的方式计算的:在生成的adj矩阵中,将有几个RAW和充满零的列。 这种情况的一个例子如下: 节点1节点2 20 21 17105 105 108 105 110 45 105 20 21 我们希望节点标签从1开始,到N=节点数结束。我们还希望保留每个节点之间的顺序关系:在前面的标记中,一个节点具有和索引i 节点1节点2 2 3 15 5

我这里的问题与语言无关,所以一个伪代码答案就可以了

假设我们有一个表示图的边列表,这个边列表是经典的二维矩阵形式。我们还假设,在这个边列表中,节点不是以连续的方式计算的:在生成的adj矩阵中,将有几个RAW和充满零的列。 这种情况的一个例子如下:

  • 节点1节点2
  • 20 21
  • 17105
  • 105 108
  • 105 110
  • 45 105
  • 20 21
我们希望节点标签从1开始,到N=节点数结束。我们还希望保留每个节点之间的顺序关系:在前面的标记中,一个节点具有和索引i
  • 节点1节点2
  • 2 3
  • 15
  • 5.6
  • 5.7
  • 4.5
  • 2 3
就我所知,这项任务可以通过两种方式实现:直接操作边列表或首先创建(稀疏)adj矩阵,然后直接删除全部为零的RAW/列(当然,后一个操作必须小心完成,因为直接删除完整的零行和列不会得到想要的结果:简单的例子是删除过程后在只有一个自循环的图中产生的简单矩阵[0 1 0 0])

我希望我已清楚说明问题


干杯

我只需要获取所有标签,对它们进行排序,然后使用这个排序列表将每个标签映射到一个整数

// Part 1 : Get all the labels and order them
S = Set<int>
for edge E in edge-list
    S.insert(E.begin) // This is just getting the node1 
    S.insert(E.end)   // and node2
L = List<int>
L.insert(S) // Just put everything that was in S in a list
sort(L)
// In your example, you would have L = [17,20,21,45,105,...]


// Part 2 : Create a renaming of the labels
M = map<int,int>
for(int i = 0; i<L.length(); ++i)
    M[L[i]] = i

// You have your renaming. Each label has now an integer mapped to it
// It has all the properties you asked
//第1部分:获取所有标签并进行排序
S=集合
对于边列表中的边E
S.insert(E.begin)//这只是获取节点1
S.insert(E.end)//和节点2
L=列表
L.insert(S)//只需将S中的所有内容都放在列表中即可
排序(L)
//在您的示例中,您的L=[17,20,21,45105,…]
//第2部分:创建标签的重命名
M=地图

对于(int i=0;i如果将图形作为
networkx
对象,则可以使用

import networkx as nx
old_graph = nx.Graph()
reindexed_graph = nx.relabel.convert_node_labels_to_integers(old_graph, first_label=0, ordering='default') #first_label is the starting integer label, in this case zero