如何从igraph中的特征值结果中获取名称属性?

时间:2015-09-11 18:12:19

标签: 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

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

2 个答案:

答案 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的顶点子集。