我有一个存储为的邻接矩阵pandas.DataFrame
:
node_names = ['A', 'B', 'C']
a = pd.DataFrame([[1,2,3],[3,1,1],[4,0,2]],
index=node_names, columns=node_names)
a_numpy = a.as_matrix()
我想igraph.Graph
从pandas
或numpy
邻接矩阵创建一个。在理想的世界中,节点将按预期命名。
这可能吗?本教程似乎对此问题保持沉默。
在igraph中,您可以使用igraph.Graph.Adjacency
从邻接矩阵创建图,而不必使用zip
。使用加权邻接矩阵并将其存储在np.array
或中时,需要注意一些事项pd.DataFrame
。
igraph.Graph.Adjacency
不能将np.array
as作为参数,但是使用可以轻松解决tolist
。
邻接矩阵中的整数被解释为节点之间的边数,而不是权重,这是通过使用邻接作为布尔值来解决的。
有关如何执行此操作的示例:
import igraph
import pandas as pd
node_names = ['A', 'B', 'C']
a = pd.DataFrame([[1,2,3],[3,1,1],[4,0,2]], index=node_names, columns=node_names)
# Get the values as np.array, it's more convenenient.
A = a.values
# Create graph, A.astype(bool).tolist() or (A / A).tolist() can also be used.
g = igraph.Graph.Adjacency((A > 0).tolist())
# Add edge weights and node labels.
g.es['weight'] = A[A.nonzero()]
g.vs['label'] = node_names # or a.index/a.columns
您可以使用get_adjacency
以下方法重建邻接数据框:
df_from_g = pd.DataFrame(g.get_adjacency(attribute='weight').data,
columns=g.vs['label'], index=g.vs['label'])
(df_from_g == a).all().all() # --> True
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句