我收到的格式如下:
tail head
P01106 Q09472
P01106 Q13309
P62136 Q13616
P11831 P18146
P13569 P20823
P20823 P01100
...
有没有一种很好的方法可以将这些数据格式化为带有numpy数组的图形?我希望使用这个图来计算PageRank。
到目前为止我已经
了import numpy as np
data = np.genfromtxt('wnt_edges.txt', skip_header=1, dtype=str)
我正在考虑使用Representing graphs (data structure) in Python中的图形数据结构,但在这种情况下似乎没有意义,因为我将进行矩阵乘法。
答案 0 :(得分:4)
为避免重新发明轮子,您应该按照评论和其他答案中的建议使用networkx。
如果出于教育目的,您希望重新发明轮子,您可以创建adjacency matrix。可以从该矩阵计算PageRank:
PageRank值是修改后的邻接矩阵的主要右特征向量的条目。
由于邻接矩阵的每一行/每列代表一个节点,因此您需要枚举节点,以便每个节点由一个从0开始的唯一编号表示。
import numpy as np
data = np.array([['P01106', 'Q09472'],
['P01106', 'Q13309'],
['P62136', 'Q13616'],
['P11831', 'P18146'],
['P13569', 'P20823'],
['P20823', 'P01100']])
nodes = np.unique(data) # mapping node name --> index
noidx = {n: i for i, n in enumerate(nodes)} # mapping node index --> name
n = nodes.size # number of nodes
numdata = np.vectorize(noidx.get)(data) # replace node id by node index
A = np.zeros((n, n))
for tail, head in numdata:
A[tail, head] = 1
#A[head, tail] = 1 # add this line for undirected graph
这会产生以下图表表示A
:
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 1., 0.],
[ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
第5行,第0列中的1表示例如从节点5到节点0存在边缘,其对应于'P20823'
- > 'P01100'
。使用nodes
数组从索引中查找节点名称:
print(nodes)
['P01100' 'P01106' 'P11831' 'P13569' 'P18146' 'P20823' 'P62136' 'Q09472'
'Q13309' 'Q13616']
如果有很多节点和很少的连接,最好使用sparse matrix
A
。但是首先要尝试使用密集矩阵,只需要切换到稀疏的内存或性能问题。
答案 1 :(得分:2)
我强烈建议networkx
:
import networkx as nx
#make the graph
G = nx.Graph([e for e in data])
#compute the pagerank
nx.pagerank(G)
# output:
# {'P01100': 0.0770275315329843, 'P01106': 0.14594493693403143,
# 'P11831': 0.1, 'P13569': 0.0770275315329843, 'P18146': 0.1,
# 'P20823': 0.1459449369340315, 'P62136': 0.1, 'Q09472':
# 0.07702753153298428, 'Q13309': 0.07702753153298428, 'Q13616': 0.1}
这就是全部。 pagerank文档就在这里。