You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetworkX转换图为NumPy矩阵报错及节点属性矩阵生成问题

解决NetworkX节点向量转NumPy矩阵的问题

我来帮你搞定这个问题!你遇到的TypeError: unhashable type: 'slice'是因为**G.node(新版NetworkX中已更新为G.nodes)并不是支持切片操作的序列**,它本质是一个类字典的NodeView对象,直接用[:]会被当作字典键来处理,而切片对象不能被哈希,所以报错了。

下面是两种可靠的方法,帮你提取节点的50维向量并生成形状为(40,50)的NumPy矩阵:

方法一:直接提取你当前设置的节点值

你的代码里直接把节点的属性字典替换成了NumPy数组(虽然这种方式不推荐,因为会破坏NetworkX节点属性的默认字典结构),可以通过遍历节点顺序来收集向量:

import numpy as np
import networkx as nx

# 构建图(balanced_tree(3,3)正好有40个节点:1+3+9+27=40)
G = nx.balanced_tree(3,3)

# 按你的方式设置节点向量(注意新版NetworkX用G.nodes[v]替代G.node[v])
for v in G.nodes():
    G.nodes[v] = np.random.random(50)

# 按节点顺序收集向量,转成NumPy矩阵
node_vectors = [G.nodes[v] for v in G.nodes()]
feature_matrix = np.array(node_vectors)

print(feature_matrix.shape)  # 输出:(40, 50)

方法二:规范的节点属性存储(推荐)

更符合NetworkX最佳实践的方式是用属性键来存储向量(比如'feature'),这样不会覆盖节点的默认属性字典,后续扩展也更灵活:

import numpy as np
import networkx as nx

G = nx.balanced_tree(3,3)
# 用指定键存储50维向量
for v in G.nodes():
    G.nodes[v]['feature'] = np.random.random(50)

# 提取指定属性的向量
node_vectors = [G.nodes[v]['feature'] for v in G.nodes()]
feature_matrix = np.array(node_vectors)

print(feature_matrix.shape)  # 输出:(40, 50)

额外说明

  • G.nodes()默认会按节点的插入顺序(这里是0到39的整数升序)返回节点,所以收集的向量顺序和节点顺序一致;如果你的节点是其他类型(比如字符串),可以用sorted(G.nodes())来确保顺序稳定。
  • 避免直接替换G.nodes[v]的值,因为NetworkX的节点属性原本是字典结构,替换成数组后会丢失添加其他属性的能力,用键值对存储属性是更合理的选择。

内容的提问来源于stack exchange,提问作者eric lardon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:06:24