为了避免重复造轮子,建议您按照评论和其他答案中的建议使用networkx。
如果出于教育目的,您想要重新发明轮子,可以创建一个
邻接矩阵。从该矩阵中可以计算出
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)
noidx = {n: i for i, n in enumerate(nodes)}
n = nodes.size
numdata = np.vectorize(noidx.get)(data)
A = np.zeros((n, n))
for tail, head in numdata:
A[tail, head] = 1
这将导致以下图形表示
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']
如果节点很多但连接较少,则最好使用
稀疏矩阵
代替
A
。但首先尝试使用密集矩阵,只有在内存或性能问题时才考虑切换到稀疏矩阵。
networkx
吗?你可以轻松地将你的数组转换成边列表。 - DYZ