我想将图形转换为numpy矩阵
我的图表有40个节点(G.nodes)
,每个节点与50个值的向量相关联。
import networkx as nx
G = nx.balanced_tree(3,3)
A = nx.adjacency_matrix(G)
for v in G.nodes():
G.node[v] = np.random.random(50)
我想得到什么?
由于我有40个节点,我需要得到(40,50)
的矩阵。
我怎样才能从G.node[v]
得到它?
我试过了什么?
matrix_graph_features=G.node[:]
我收到了以下错误:
TypeError: unhashable type: 'slice'
答案 0 :(得分:0)
首先,您需要正确存储与每个节点关联的数据。由于您使用的是生成器balanced_tree
,因此之后添加属性比在图形构建期间更容易。 This answer还显示了在添加节点时添加属性的方法。
import networkx as nx
import numpy as np
propname = "vals" # use a more meaningful name for your application!
G = nx.balanced_tree(3,3)
#A = nx.adjacency_matrix(G)
for v in G.nodes():
G.node[v][propname] = np.random.random(50)
现在要访问数据,您可以使用G.nodes(data=True)
进行迭代,或者如果要访问所有节点的特定数据属性,可以使用函数nx.get_node_attribues
。下面我将展示如何在40x50矩阵中获取上面的随机值:
M = np.array([v for k, v in nx.get_node_attributes(G, propname).iteritems()])
print(G.number_of_nodes())
>>> 40
print(M.shape)
>>> (40, 50)
现在您的数据是二维数组形式,很容易执行进一步的操作,例如M.mean(), M.std()
等。
注意:您应该注意此矩阵中行的排序,尤其是在运行时添加任何新节点时。