我正在编写一个继承自python中开源networkx包的DiGraph.py的类。
在我班级的某些方法中,我需要搜索具有一定度数的节点(有向图的outdegrees或indegree)并返回它们。
该类用于数据挖掘项目\自然语言处理,它将用于极大的网络。我需要的是快速实现所描述的方法(返回具有一定程度或某种度数的节点列表)。
超类中已经定义了一些东西:
1.方法network.outdegree()
:
返回包含节点键和outdegree值的字典。
{'school': 4, 'middle school': 0, 'university': 0, 'commercial': 0, 'private': 5, 'institution': 2, 'high school': 0, 'college': 0, 'elementary school': 0, 'central': 0, 'company': 0, 'public': 3, 'bank': 2}
network.out_degree_iter()
<generator object out_degree_iter at 0x02EEB328>
我不知道如何使用这种方法,如果有人能解释如何使用,我将不胜感激。
3.我有一个属性network.nodes,它是我网络中所有节点的列表。
问题:我可以遍历所有节点并返回带有outdegree 2的节点,例如,通过在network.nodes上执行列表解析,或者我可以迭代我的字典并返回值为2的节点列表,或者也许使用我不知道如何使用的out_degree_iter()
或者如何与for循环中的字典项迭代不同(对于k,v在dict.iteritems()中)?对于非常大的节点和边缘网络,哪一个会更快,为什么?
由于
答案 0 :(得分:2)
迭代器更适合大型图形,因为您不构造字典的副本。这样的事情怎么样:
list_of_2 = []
for g in G.out_degree_iter():
if g[1]==2:
list_of_2.append(g[0])
或者,
list_of_2 = map(lambda x:x[0],filter(lambda x:(x[1]==2),G.out_degree_iter()))
答案 1 :(得分:2)
最简单的方法是使用out_degree_iter()方法和你提出的列表推导。方法如下:
import networkx as nx
G=nx.DiGraph(nx.gnp_random_graph(1000,0.001))
t1=[n for n,k in G.out_degree_iter() if k==2
最快的方法是访问内部数据结构:
t2=[n for n,nbrs in G.succ.items() if len(nbrs)==2]
对于in-degree我们in_degree_iter()和G.pred.items()。
以下是一些时间
In [41]: %timeit t1=[n for n,k in G.out_degree_iter() if k==2]
1000 loops, best of 3: 368 us per loop
In [42]: %timeit s2=[n for n,nbrs in G.succ.items() if len(nbrs)==2]
1000 loops, best of 3: 198 us per loop