我将边缘列表导入igraph。
数据看起来像这样。
393795446 18215973
393795446 582203919
393795446 190709835
393795446 1093090866
393795446 157780872
393795446 1580109739
393795446 3301748909
393795446 1536791610
393795446 106170345
393795446 9409752
Twitter粉丝的内容(来源,目标)。
我是通过运行此代码导入的。
from igraph import *
import timeit
twitter_igraph = Graph.Read_Ncol('twitter_edgelist.txt', directed=True)
print twitter_igraph.summary()
IGRAPH DN-- 2869228 6764984 --
+ attr: name (v)
导入已完成,我可以通过twitter_igraph.vs.find(name='393795446')
然而,当我运行特征值计算时,它只返回所有顶点的列表,我不知道如何反向查找以获取twitter id。
start = timeit.default_timer()
igraph_eg = twitter_igraph.evcent()
stop = timeit.default_timer()
print 'It takes {} seconds to finish'.format(stop - start)
igraph_eg.sort(reverse=True)
print igraph_eg[:10]
在我排序igraph_eg
后,我可以获得前10个特征值,但我想显示该顶点的name
属性。如何使用特征值打印顶点名称?
这是我的解决方法
np_vals = numpy.array(igraph_eg)
sorted_eigen = numpy.argsort(np_vals)[::-1][:20]
for eg in sorted_eigen:
print twitter_igraph.vs.find(eg)['name']
答案 0 :(得分:0)
这绝不是最好的解决方案,但它有效。请记住,即使多个节点共享相同的特征向量中心分数,它也只会返回单个节点ID。
def eigenID(ev, graph):
'''
ev - eigenvector centrality value that you're locating
graph - the graph object that you're looking in
'''
g = graph
evs = g.evcent()
ids = g.vs['name']
ev_index = evs.index(ev)
node_id = ids[ev_index]
return node_id
如果它没有用,我可以稍后改进它。
让我知道。
答案 1 :(得分:0)
试试这个:
ids = sorted(range(g.vcount()), key=igraph_eg.__getitem__, reverse=True)
names = g.vs[ids]["name"]
这将按照降低特征向量中心性的顺序为您提供顶点的ID。但是,由于您最有可能只对前几个顶点感兴趣,因此使用堆的局部排序可能会更快:
from heapq import nlargest
ids = nlargest(10, xrange(g.vcount()), key=igraph_eg.__getitem__)
names = g.vs[ids]["name"]
这适用于Python 2.x;如果您使用的是Python 3.x,请使用range
代替xrange
。
对于它的价值,基于NumPy的argsort
解决方案同样出色,因此您也可以使用sorted_eigen
,如下所示:
names = g.vs[sorted_eigen]["name"]
请注意,您可以将顶点索引向量直接插入g.vs[]
以获取具有这些ID的顶点子集。