我有一个networkx图形对象,它是加权和无向的。 我试图用Adamic Adar Index预测每个节点的10个新链接。 Networkx中的函数adamic_adar_index返回元组生成器,格式为(nodeid1,nodeid2,adamic_adar_index)。我不熟悉Python中的生成器。我想要做的是按nodeid1对生成器进行分组,并返回nodeid1的最大10个索引。
这是我的代码,其中" coauthor"是网络对象和" preds"是发电机。数据文件位于https://www.dropbox.com/s/hyr1hgjs4yt03x2/coauthor.csv?dl=0
import csv
import networkx as nx
g = nx.read_weighted_edgelist("coauthor.csv", delimiter='\t', encoding='utf-8')
coauthor = nx.read_weighted_edgelist("coauthor.csv", delimiter='\t', encoding='utf-8')
preds = nx.adamic_adar_index(coauthor)
答案 0 :(得分:4)
看看heapq.nlargest它需要一个iterable并返回该iterable中的n个最大的东西。由于我没有您的共同作者列表,我将使用空手道图。而不是立即查看所有非边缘(正如默认情况下adamic_adar_index所做的那样),我将通过G中的每个节点u并为所有非邻居执行此操作
import networkx as nx
import heapq
def nonedges(G,u): #a generator with (u,v) for every non neighbor v
for v in nx.non_neighbors(G, u):
yield (u, v)
G = nx.karate_club_graph()
for u in G.nodes_iter():# you may want to check that there will be at least 10 choices.
preds = nx.adamic_adar_index(G,nonedges(G,u))
tenlargest = heapq.nlargest(10, preds, key = lambda x: x[2])
print tenlargest
警告:如果您在此处不小心,那么您所描述的算法中存在一个错误:对于节点1,您可能会发现某些元组被返回为(1,2,3.2),( 1,3,0.3),(4,1,100)。你描述分组的方式,你会错过(4,1)对。我的示例检查每对两次以避免这种情况。您可以通过一些努力来消除这种重复的计算机工作。
生成器和迭代器密切相关。有关迭代器的更多信息位于https://docs.python.org/2/glossary.html#term-iterator(您还可以在该页面上找到生成器)。您可以将其视为列表,但有关于您如何允许访问它的规则。每次看到它,你都会得到下一个元素。一旦你看到元素,它就会从迭代器中删除。你只能从迭代器中得到一件事。在计算机存储器中,它不必保持整个事物(当它被要求时它会产生下一个元素)。例如,你可以看到我在循环中使用了迭代器而不是G.nodes()。这意味着计算机永远不必将G中的所有节点都保存在其内存中。
for u in G.nodes_iter():
与
for u in G.nodes()