[英]NetworkX: adjacency matrix does not correspond to graph
假設我有兩個選項來生成網絡的鄰接矩陣 : nx.adjacency_matrix()
和我自己的代碼。 我想測試我的代碼的正確性,並提出了一些奇怪的不等式。
示例: 3x3
網格網絡。
import networkx as nx
N=3
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))
plt.figure()
nx.draw_networkx(G, pos=pos2, with_labels=True, node_size = 200)
與nx.adjacency_matrix()
的鄰接矩陣:
B=nx.adjacency_matrix(G)
B1=B.todense()
[[0 0 0 0 0 1 0 0 1]
[0 0 0 1 0 1 0 0 0]
[0 0 0 1 0 1 0 1 1]
[0 1 1 0 0 0 1 0 0]
[0 0 0 0 0 0 0 1 1]
[1 1 1 0 0 0 0 0 0]
[0 0 0 1 0 0 0 1 0]
[0 0 1 0 1 0 1 0 0]
[1 0 1 0 1 0 0 0 0]]
據此,節點0
(整個第1行和整個第1列)連接到節點5
和8
。 但是如果你看一下上面的圖像,這是錯誤的,因為它連接到節點1
和3
。
現在我的代碼(在與上面相同的腳本中運行):
import numpy
import math
P=3
def nodes_connected(i, j):
try:
if i in G.neighbors(j):
return 1
except nx.NetworkXError:
return False
A=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():
A[i][:]=0
A[:][i]=0
elif i in G.nodes():
A[i][j]=nodes_connected(i,j)
A[j][i]=A[i][j]
for i in range(0,P*P,1):
for j in range(0,P*P,1):
if math.isnan(A[i][j]):
A[i][j]=0
print(A)
這會產生:
[[ 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
和3
。 為什么存在這種差異? 這種情況有什么問題?
Networkx不知道您希望節點的順序。
以下是如何調用它: adjacency_matrix(G, nodelist=None, weight='weight')
。
如果需要特定訂單,請將nodelist設置為該訂單中的列表。 因此,例如adjacency_matrix(G, nodelist=range(9))
應該得到你想要的。
為什么是這樣? 好吧,因為圖形可以包含任何東西作為其節點(任何可以清除)。 你的一個節點可能是"parrot"
或(1,2)
。 因此它將節點存儲為dict中的鍵,而不是假設它是從0開始的非負整數.Dict鍵具有任意順序 。
一個更通用的解決方案,如果您的節點具有一些邏輯排序,如果您使用G=nx.grid_2d_graph(3,3)
生成圖形(從(0,0)到(2,2)返回tupples),或者在你的例子中將使用:
adjacency_matrix(G,nodelist=sorted(G.nodes()))
這會對返回的G節點列表進行排序,並將其作為節點列表傳遞
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.