算子理論的一個分支研究移位算子S.基本上,給定一個圖的權重分配給圖的每個頂點,移位算子產生一個新圖,相同的圖(A)並用頂點鄰居的權重之和替換每個頂點的權重。例如,在圖3(A)所取代5 + 5 + 2 + 0使用NetworkX研究移位算子和其他數學創建
甲
乙
誰知道是否能networkx幫我自動化一個任意圖的過程,G?此外,我可能構建的圖的大小(頂點,邊等)有什麼限制?
算子理論的一個分支研究移位算子S.基本上,給定一個圖的權重分配給圖的每個頂點,移位算子產生一個新圖,相同的圖(A)並用頂點鄰居的權重之和替換每個頂點的權重。例如,在圖3(A)所取代5 + 5 + 2 + 0使用NetworkX研究移位算子和其他數學創建
甲
乙
誰知道是否能networkx幫我自動化一個任意圖的過程,G?此外,我可能構建的圖的大小(頂點,邊等)有什麼限制?
首先,您需要創建一個圖並添加節點權重。 我以a
到h
的字母命名節點。 對於較大的圖形,您需要一種不同的命名節點方式(因此每個節點都有唯一的名稱)。
在下面的代碼中,我還繪製了節點名稱。 請注意,我手動設置節點位置,所以我有和你一樣的例子。 查看更大的圖表graph layouts。
import networkx as nx
from matplotlib import pyplot as plt
G = nx.Graph()
nodes = [
['a', {'weight' : 5}],
['b', {'weight' : 4}],
['c', {'weight' : 2}],
['d', {'weight' : 3}],
['e', {'weight' : 5}],
['f', {'weight' : 0}],
['g', {'weight' : 0}],
['h', {'weight' : 1}]
]
for node in nodes:
G.add_node(node[0], node[1]) # add node and node weight from list
G.add_edges_from([
('a', 'd'),
('b', 'e'),
('c', 'd'),
('d', 'e'),
('d', 'g'),
('e', 'h'),
('e', 'f')
])
pos = {'a' : (1, 2), 'b' : (2, 2), 'c' : (0, 1), 'd' : (1, 1), 'e' : (2, 1), 'f' : (3, 1), 'g' : (1, 0), 'h' : (2, 0)} # manual fixed positions
plt.figure()
nx.draw(G, pos=pos, with_labels=True, node_size=700, node_color='w') # draw node names
plt.show()
輸出:
這裏是繪製結點的權代碼:
plt.figure()
nx.draw(G, pos=pos, labels=nx.get_node_attributes(G, 'weight'), node_size=700, node_color='w') # draw node weights
plt.show()
最後計算的移位運算符是代碼。 您可以通過G[node]
獲得某個節點node
的鄰居。 某些節點neighbor
的weight
屬性可以通過G.node[neighbor]['weight']
訪問。
使用這個和列表理解我總結當前節點的所有鄰居節點的權重列表。請注意,新的權重設置爲nx.set_node_attributes(G, 'weight', new_weights)
。
new_weights = {}
for node in G.nodes():
new_weights[node] = sum([G.node[neighbor]['weight'] for neighbor in G[node]]) # sum weights of all neighbors of current node
nx.set_node_attributes(G, 'weight', new_weights) # set new weights
plt.figure()
nx.draw(G, pos=pos, labels=nx.get_node_attributes(G, 'weight'), node_size=700, node_color='w') # draw new node weights
plt.show()
最終圖表:
我相信networkx可用來做到這一點。它應該只需要通過網絡循環,併爲每個節點分配一個新的權重(在完成此操作之前注意不要覆蓋舊的權重)。你試過什麼了? – Joel