NetworkX:部分故障图/网络的邻接矩阵

时间:2016-05-19 15:10:45

标签: python matrix networkx adjacency-matrix

回想一下,如果连接两个节点,邻接矩阵给我们1,否则0,我想为一个常规图计算一个矩阵,其所有节点active和一个表示同一个图,其中一些节点有failed

让我们考虑一个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

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

我的问题:如何确保Matrix A1 具有相同大小的Matrix A ?也就是说,如果节点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

2 个答案:

答案 0 :(得分:4)

尝试REGISTER_KERNEL_BUILDER( Name("RimeBSqrt") .Device(tensorflow::DEVICE_GPU) .TypeConstraint<float>("FT") .TypeConstraint<tensorflow::complex64>("CT") .HostMemory("ref_freq"), RimeBSqrt<tensorflow::GPUDevice, float, tensorflow::complex64>); ,它将删除G.remove_edges_from(G.edges(0))的所有边缘,而不是整个节点。然后生成邻接矩阵。

答案 1 :(得分: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允许打印出的行/列按0排序到{{1其中K是节点总数):

K

enter image description here

如果节点[[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)替换其连接(1),同时保留邻接矩阵的大小。在这种情况下,行0和列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)

Matrix 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.]] 没有任何连接。它还告诉我们,与矩阵A类似,节点0连接到节点12

如果有人提出更正建议,欢迎这样做。