道歉,如果这是一个明显的错误 - 我是一个Python新手。无论如何,我正在使用Python中的NetworkX包生成一系列图形。基本上我正在做的是通过优先附件将图形增加到“n”个顶点,但保存每个“切片”。我的代码如下所示:
# function to generate a sequence of barabasi-albert random graphs
import networkx as nx
def pa_graph_seq(n, m, c=0, G=None, seed=None, seq=True):
# Note: seq = True means function returns a list of
# networkx graph objects. Otherwise returns the
# graph from the final time slice
# Some preliminary checks
if m<1 or m>=n:
raise nx.NetworkXError(\
"BA network must have m>=1 and m<n, m=%d,n=%d"%(m,n))
if seed is not None:
random.seed(seed)
if G is not None and len(G) >= n:
raise nx.NetworkXError(\
"G must have strictly less than n nodes")
# If initial graph was not specified, initialize empty graph
if G==None: G = nx.MultiGraph()
# If seq==True, initialize the list with the initial graph
if seq==True: Gseq = [G]
# Grow the graph
step = len(G)+1
while step <= n:
# Add a single node
G.add_node(1)
# Add edges
for i in range(m):
# Get degree sequence of current graph
deg = nx.degree(G)
d = deg.values()
# Increment degree of new node by 1
d[len(d)-1] = d[len(d)-1]+1
# Sample node and attach edge
newnode = deg_sample(d,c)
G.add_edge(step,deg_sample(d,c))
# If seq==True, append onto Gseq
if seq==True: Gseq.append(G)
step += 1
# Next loop for debugging only
for i in range(len(Gseq)):
print nx.nodes(Gseq[i])
if seq == True:
return Gseq
else:
return G
我遇到的奇怪问题是最终的Gseq
列表似乎只包含最终图表的n
个副本。例如,小调试循环(# Next loop for...
)中的输出如下所示:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
实际上第一个元素的长度应为0,第二个元素的长度为1,等等...(因为我们每次添加一个节点,根据优先附件)。对于任何人来说,我在这里犯的错误显而易见吗?我已经确认如果我只是在main for循环中添加print nx.nodes(G)
,那么输出看起来我想要它...
感谢您的帮助和耐心!
答案 0 :(得分:1)
代码只会将G
的引用附加到GSeq
,而不会实际附加新的图形对象。要获得您想要的行为,请将if G==None: G = nx.MultiGraph()
放在主循环中。
为了更好地理解python如何处理mutable vs immutable上的数据读取。
我认为@markusian有正确的想法。 MultiGraph有一个copy method可以帮助你找到你想要的行为。尝试像
这样的东西if seq==True: Gseq.append(G.copy())