我是一个非常非常平庸的程序员,但我仍然打算使用igraphpython库来确定用户在给定论坛中的中心地位的影响,以预测他以后对该论坛的贡献。
我联系了其他人,他们使用NetworkX库来做类似的事情,但是考虑到论坛的当前规模,计算精确的中心度指数实际上是不可能的——这需要太多时间。
这是他的密码:
import networkx as netx
import sys, csv
if len(sys.argv) is not 2:
print 'Please specify an input graph.'
sys.exit(1)
ingraph = sys.argv[1]
graph = netx.readwrite.gpickle.read_gpickle(ingraph)
num_nodes = len(graph.nodes())
print '%s nodes found in input graph.' % num_nodes
print 'Recording data in centrality.csv'
# Calculate all of the betweenness measures
betweenness = netx.algorithms.centrality.betweenness_centrality(graph)
print 'Betweenness computations complete.'
closeness = netx.algorithms.centrality.closeness_centrality(graph)
print 'Closeness computations complete.'
outcsv = csv.writer(open('centrality.csv', 'wb'))
for node in graph.nodes():
outcsv.writerow([node, betweenness[node], closeness[node]])
print 'Complete!'
我试着用igraph库写一些类似的东西(它允许快速估计而不是精确计算),但是我似乎不能将数据写入CSV文件。
我的代码:
import igraph
import sys, csv
from igraph import *
graph = Graph.Read_Pajek("C:\karate.net")
print igraph.summary(graph)
estimate = graph.betweenness(vertices=None, directed=True, cutoff=2)
print 'Betweenness computation complete.'
outcsv = csv.writer(open('estimate.csv', 'wb'))
for v in graph.vs():
outcsv.writerow([v, estimate[vs]])
print 'Complete!'
我在igraph文档中找不到如何调用单个顶点(或节点,在NetworkX术语中),所以这就是我得到错误消息的地方。也许我也忘记了一些其他的东西;我可能是一个糟糕的程序员,以至于没有注意到:P
我做错什么了?
因此,为了清楚起见,以下几点最终证明了这一点:
正如您已经注意到的,igraph中的各个顶点都是使用graph对象的
vs
属性访问的。vs
的行为类似于一个列表,因此对其进行迭代将产生图的顶点。每个顶点由Vertex
类的一个实例表示,顶点的索引由其index
属性给出。(请注意,igraph对顶点和边都使用连续的数字索引,因此您需要index
属性,而不能直接使用原始顶点名称)。我假设您需要的是最初存储在输入文件中的顶点的名称。名称存储在
name
或id
顶点属性中(取决于输入格式),因此您可能需要:注意顶点属性是通过索引顶点对象来访问的,就像它是一个字典一样。另一种方法是直接使用
vs
对象作为字典;这将为您提供一个包含所有顶点的给定顶点属性值的列表。E、 g.:使用生成器表达式的更快版本:
相关问题 更多 >
编程相关推荐