Python 如何从igraph特征值的结果中得到name属性?

Python 如何从igraph特征值的结果中得到name属性?,python,social-networking,igraph,Python,Social Networking,Igraph,我将边列表导入igraph 数据如下所示 393795446 18215973 393795446 582203919 393795446 190709835 393795446 1093090866 393795446 157780872 393795446 1580109739 393795446 3301748909 393795446 1536791610 393795446 106170345 393795446 9409752 这是推特粉丝的一些东西(来源、目标) 我通过运行此代码

我将边列表导入igraph

数据如下所示

393795446 18215973
393795446 582203919
393795446 190709835
393795446 1093090866
393795446 157780872
393795446 1580109739
393795446 3301748909
393795446 1536791610
393795446 106170345
393795446 9409752
这是推特粉丝的一些东西(来源、目标)

我通过运行此代码导入

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\u 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']

这决不是最好的解决方案,但它是有效的。请记住,它将只返回单个节点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
如果没有帮助的话,我可以在以后改进它

让我知道。

试试这个:

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"]
这是针对Python2.x的;如果您使用的是Python3.x,请使用
range
而不是
xrange

值得一提的是,使用
argsort
的基于NumPy的解决方案同样不错,因此您也可以从中使用
sorted\u eigen
,如下所示:

names = g.vs[sorted_eigen]["name"]
请注意,您可以将顶点索引向量直接插入
g.vs[]
以获得具有这些ID的顶点子集