[英]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
現在,兩個矩陣的大小明顯不同。
我的問題 :如何確定矩陣A1的大小與矩陣A相同? 這就是說,如果節點0
因為失敗而不會出現,我希望將0
對應於第0-th
行和0-th
列放入A1 中 ,以便矩陣的大小保持不變。 為了比較和計算,我需要這樣做。 但是要做到這一點,我假設我需要訪問創建鄰接矩陣的函數。 我可以用更簡單的方式做到嗎?
節點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的建議,我提出了這種方法。 我想在這里發布它,以便任何有意願的人都可以提出改進建議。
對於常規的3x3
網絡,這是我們以公允的方式獲取鄰接矩陣的方式:
#Create the graph (see question above)
A=nx.adjacency_matrix(G, nodelist=range(N*N))
A=A.todense()
這將產生一個N^2xN^2
矩陣,其中每個行/列對應一個特定節點(使用nodelist
允許打印出要打印的行/列,排序為0
到K
,其中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
連接到節點2
和4
。
如果有人有更正的建議,歡迎您提出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.