【问题标题】:TypeError: unhashable type: 'slice' when converting graph to numpy matrix [NetworkX]TypeError: unhashable type: 'slice' 将图形转换为 numpy 矩阵 [NetworkX]
【发布时间】:2018-03-20 16:31:46
【问题描述】:

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

【问题讨论】:

  • 看起来 node 是字典,或者类似字典。 : 用于列表和 numpy 数组。
  • 我不明白你的目标是什么。你能明确给出你想要的输出吗?不清楚“(40,50) 的矩阵”是什么意思
  • 40 个示例,每个示例有 50 个值,因此矩阵为 (40,50)
  • G.node[0]= 50 个值的向量 ..... G.node[39]= 50 个值的向量

标签: python-3.x numpy scipy networkx


【解决方案1】:

首先,您需要正确存储与每个节点关联的数据。由于您使用的是生成器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()等。 注意:您应该注意此矩阵中行的顺序,特别是如果您在运行时添加任何新节点。

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多