NetworkX:部分失败图/网络的邻接矩阵

3
回想一下邻接矩阵会在两个节点相连时给出 1,否则就是 0。我希望计算一个所有节点都处于活跃状态的普通图的矩阵和一个 同一张图 中有一些节点失败的矩阵。
我们考虑一个2x2节点的点阵网络。其邻接矩阵 (A) 如下:
0  1  1  0
1  0  0  1
1  0  0  1
0  1  1  0

导致这张图的结果如下: enter image description here 现在,让我们移除节点0:
G.remove_node(0)

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

返回此图: enter image description here

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

我的问题:如何确保矩阵A1与矩阵A具有相同的大小?也就是说,如果节点0不存在,因为它已经失败了,我希望在A1 中对应于0-th行和列的位置放置一个0,以使矩阵的大小保持不变。我需要这样做是为了比较和计算的目的。但是为了做到这一点,我认为我需要访问创建邻接矩阵的函数。我能不能用更简单的方法做到这一点?

节点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
2个回答

4
尝试使用G.remove_edges_from(G.edges(0))来删除所有与节点0相连的边,而不是删除整个节点。然后生成邻接矩阵。

知道了。但是如果我的“失败”的网络来自我调用并处理以生成邻接矩阵的pickle呢?和我三个节点的例子一样,只是没有使用G.remove_node(0)删除节点,而是基于不同的标准。如果与原始网络相比,我的pickle的邻接矩阵大小较小。你明白我的意思吗? - FaCoffee

1

基于一些研究和Joel的建议,我想出了这种方法。我想在这里发布它,以便任何有意愿的人可以提出改进意见。

对于一个常规的 3x3 网格,这是我们如何正确地获取邻接矩阵:

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

这将产生一个N^2xN^2矩阵,其中每行/列对应于特定节点(使用nodelist允许将行/列按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]]

enter image description here

如果节点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 连接到节点 2 和节点 4。
如果有人对此有更正意见,请随时提出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接