NetworkX:部分失败的邻接矩阵 graphs/networks

NetworkX: Adjacency Matrix of partially failed graphs/networks

回想一下,如果两个节点相连,邻接矩阵给我们 1,否则 0,我想为一个包含所有节点 active 的正则图计算一个矩阵,和一个 用于同一个图 ,其中一些节点具有 failed.

让我们考虑一个 2x2 节点的格子网络。它的邻接矩阵(A)是:

0  1  1  0
1  0  0  1
1  0  0  1
0  1  1  0

导致此图表:

现在,让我们删除节点 0:

G.remove_node(0)

这是新的邻接矩阵 (A1) 的样子:

0  0  1
0  0  1
1  1  0

返回此图表:

现在,这两个矩阵的大小明显不同。

我的问题:如何确保 Matrix A1 与 Matrix A[= 的大小相同58=]?也就是说,如果节点 0 由于失败而不会出现,我希望将 0 放置在 A1 对应0-th行和列,这样矩阵的大小就保持不变。为了比较和计算的目的,我需要这样做。但要做到这一点,我假设我需要访问创建邻接矩阵的函数。我可以用更简单的方法来做吗?

节点 0 失败的示例:

0  0  0  0
0  0  0  1
0  0  0  1
0  1  1  0

这就是我创建 2x2 网络并生成邻接矩阵的方式:

import networkx as nx

N=2
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i,j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
inds=labels.keys()
vals=labels.values()
inds.sort()
vals.sort()
pos2=dict(zip(vals,inds))
nx.draw_networkx(G, pos=pos2, with_labels=True, node_size = 200)

A=nx.adjacency_matrix(G)
A.toarray()

#G.remove_node(i) to remove node i

尝试 G.remove_edges_from(G.edges(0)),这将删除 0 的所有边而不是整个节点。然后生成邻接矩阵。

根据一些研究和 Joel 的建议,我想出了这个方法。我想post放在这里,让有意愿的人提出改进意见。

对于一个正规的3x3网络,正则化得到邻接矩阵是这样的:

#Create the graph (see question above)
A=nx.adjacency_matrix(G, nodelist=range(N*N))
A=A.todense()

这会产生一个 N^2xN^2 矩阵,其中每个 row/column 对应于一个特定的节点(使用 nodelist 允许对 rows/columns 进行排序 0K 其中 K 是节点总数):

[[0 1 0 1 0 0 0 0 0]
 [1 0 1 0 1 0 0 0 0]
 [0 1 0 0 0 1 0 0 0]
 [1 0 0 0 1 0 1 0 0]
 [0 1 0 1 0 1 0 1 0]
 [0 0 1 0 1 0 0 0 1]
 [0 0 0 1 0 0 0 1 0]
 [0 0 0 0 1 0 1 0 1]
 [0 0 0 0 0 1 0 1 0]]

如果节点 0 失败,我们将不得不用不存在的连接 (0) 替换它的连接 (1),同时保留邻接矩阵的大小。在这种情况下,行 0 和列 0 将填充为 0。我的解决方案如下:

P=K #Total number of nodes before failures

def nodes_connected(i, j):
     try: 
        if i in G.neighbors(j):
            return 1
     except nx.NetworkXError:
        return False          

A1=numpy.zeros((P*P,P*P))

for i in range(0,P*P,1):
    for j in range(0,P*P,1):              
        if i not in G.nodes():
            A1[i][:]=0
            A1[:][i]=0
        elif i in G.nodes():
            A1[i][j]=nodes_connected(i,j)
                A1[j][i]=A1[i][j]
for i in range(0,P*P,1):
    for j in range(0,P*P,1):
            if math.isnan(A1[i][j]):
                A1[i][j]=0              
print(A1)

这会产生以下结果:

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.  0.]
 [ 0.  1.  0.  1.  0.  1.  0.  1.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.  1.]
 [ 0.  0.  0.  0.  0.  1.  0.  1.  0.]]

矩阵 A1 现在告诉我们节点 0 没有任何连接。它还告诉我们,类似于矩阵 A,节点 1 连接到节点 24.

如果有人要提出更正,欢迎提出。