如何从igraph中的特征值结果中获取名称属性?
How to get name property out of the result of eigenvalue in igraph?
我将边列表导入 igraph。
数据是这样的。
393795446 18215973
393795446 582203919
393795446 190709835
393795446 1093090866
393795446 157780872
393795446 1580109739
393795446 3301748909
393795446 1536791610
393795446 106170345
393795446 9409752
这是推特追随者的东西(来源,目标)。
我通过 运行ning 这段代码导入。
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')
取回任何顶点
但是,当我 运行 计算特征值时,它 returns 只是所有顶点的列表,我不确定如何反向查找以获得 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']
这绝不是最好的解决方案,但它确实有效。请记住,即使多个节点共享相同的特征向量中心性分数,它也只会 return 一个节点 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"]
这是为了 Python 2.x;如果您在 Python 3.x,请使用 range
而不是 xrange
。
对于它的价值,你基于 NumPy 的解决方案 argsort
同样好,所以你也可以从那里使用 sorted_eigen
如下:
names = g.vs[sorted_eigen]["name"]
请注意,您可以将顶点索引向量直接插入 g.vs[]
以获得具有这些 ID 的顶点子集。
我将边列表导入 igraph。
数据是这样的。
393795446 18215973
393795446 582203919
393795446 190709835
393795446 1093090866
393795446 157780872
393795446 1580109739
393795446 3301748909
393795446 1536791610
393795446 106170345
393795446 9409752
这是推特追随者的东西(来源,目标)。
我通过 运行ning 这段代码导入。
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')
但是,当我 运行 计算特征值时,它 returns 只是所有顶点的列表,我不确定如何反向查找以获得 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']
这绝不是最好的解决方案,但它确实有效。请记住,即使多个节点共享相同的特征向量中心性分数,它也只会 return 一个节点 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"]
这是为了 Python 2.x;如果您在 Python 3.x,请使用 range
而不是 xrange
。
对于它的价值,你基于 NumPy 的解决方案 argsort
同样好,所以你也可以从那里使用 sorted_eigen
如下:
names = g.vs[sorted_eigen]["name"]
请注意,您可以将顶点索引向量直接插入 g.vs[]
以获得具有这些 ID 的顶点子集。