2015-09-11 63 views
0

我將一列邊緣導入到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')

但是得到任何頂點回來,當我運行特徵值計算它返回只是所有這一切,我不知道如何反向查找頂點的列表獲取推特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

試試這個:

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

對於它的價值,你有argsort基於NumPy的解決方案同樣出色,所以你也可以使用sorted_eigen從那裏如下:

names = g.vs[sorted_eigen]["name"] 

請注意,您可以直接插入一個頂點索引向量爲g.vs[]用這些ID獲得頂點的子集。

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 

如果沒有幫助,我可以稍後再細化。

讓我知道。

相關問題