Python Networkx图形生成函数-For循环



我已经创建了一个函数来在Networkx中生成100个随机图,我希望输出是图列表,以及在每个生成的图上运行的几个函数(直径、传递性和平均最短路径长度(。我的输出似乎是在同一个第一次生成的图上迭代,而不是通过生成的每个样本图。我是编程新手,相信这与我的循环结构有关,但我很感激任何建议,尽管我知道答案可能是基本的。我使用的是Python 3.9和NetworkX 2.5


def random_networks_generator(n,p,num_networks=1, directed=False):
Graph_list=[]
dias=[]
trans=[]
avgpath=[]
for num in range (0,num_networks):
G=nx.gnp_random_graph(n,p,directed)
D=nx.diameter(G)
APL=nx.average_shortest_path_length(G)
T=nx.transitivity(G)
Graph_list.append(G)
dias.append(D)
trans.append(T)
avgpath.append(APL)
return Graph_list, dias, trans, avgpath 
random_networks_generator(793,.04,3,directed=False)
OUT: 
([<networkx.classes.graph.Graph at 0x7fdc6889dbb0>,
<networkx.classes.graph.Graph at 0x7fdc6889d0d0>,
<networkx.classes.graph.Graph at 0x7fdc6889d160>],
[3, 3, 3],
[0.039558780162902554, 0.039558780162902554, 0.039558780162902554],
[2.235259276242883, 2.235259276242883, 2.235259276242883]) 

这是一个微妙的错误,但问题是这一行:

G=nx.gnp_random_graph(n,p,directed)

问题是,如果你看nx.gnp_random_graph的签名,第三个参数是随机数生成器的种子,而不是图是否有向:

def gnp_random_graph(n, p, seed=None, directed=False):
"""Returns a $G_{n,p}$ random graph, also known as an Erdős-Rényi graph
or a binomial graph.
The $G_{n,p}$ model chooses each of the possible edges with probability $p$.
Parameters
----------
n : int
The number of nodes.
p : float
Probability for edge creation.
seed : integer, random_state, or None (default)
Indicator of random number generation state.
See :ref:`Randomness<randomness>`.
directed : bool, optional (default=False)
If True, this function returns a directed graph.

您正在传递False作为种子(它被视为整数0(。给定这样的固定种子,(伪(随机数生成器将始终生成相同的随机数序列,因此";"随机";图形将始终相同。

修复非常简单——只需将directed=False作为关键字参数传递即可。总的来说,这是一个好主意,因为它可以防止这些问题,这些问题来自于不记住位置论点的顺序:

import networkx as nx

def random_networks_generator(n, p, num_networks=1, directed=False):
Graph_list = []
dias = []
trans = []
avgpath = []
for _ in range(num_networks):
G = nx.gnp_random_graph(n, p, directed=directed)
D = nx.diameter(G)
APL = nx.average_shortest_path_length(G)
T = nx.transitivity(G)
Graph_list.append(G)
dias.append(D)
trans.append(T)
avgpath.append(APL)
return Graph_list, dias, trans, avgpath 
results = random_networks_generator(793, .04, 3, directed=False)
for x in results:
print(x)
"""
Output:
[<networkx.classes.graph.Graph object at 0x7f61be2a8040>, <networkx.classes.graph.Graph object at 0x7f61be28fd30>, <networkx.classes.graph.Graph object at 0x7f61be1eeaf0>]
[3, 3, 3]
[0.03973988995344184, 0.040121944443041235, 0.03966888841109439]
[2.238010623256525, 2.2307373864750915, 2.22814844536156]
"""

我也清理了你的代码。查看一个符合PEP8的linter,如flake8,以养成良好的Python习惯(或者使用一个内置linting的IDE,如PyCharm(。

最新更新