TypeError:不可用类型:将图形转换为numpy矩阵时的'slice'[NetworkX]

时间:2018-03-20 16:31:46

标签: python-3.x numpy scipy networkx

我想将图形转换为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'

1 个答案:

答案 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()等。 注意:您应该注意此矩阵中行的排序,尤其是在运行时添加任何新节点时。