NetworkX网格图节点按度排序报错:不可哈希类型问题
解决NetworkX 3D网格图节点度数排序时的"unhashable types"错误
我来帮你搞定这个问题!你遇到的unhashable types错误,核心原因是尝试用numpy的索引数组直接访问NetworkX的节点字典——NetworkX网格图的节点是元组(比如(1,2,3)),属于可哈希类型,但numpy返回的索引是数组对象,用它去查节点字典就会触发哈希错误。另外,新版本NetworkX里A.node已经被弃用,建议用A.nodes或A.nodes()来操作节点。
正确的实现步骤
我们可以直接通过NetworkX的原生方法处理节点和度数,或者用numpy但避开字典索引的坑,两种方案都给你:
方案1:纯NetworkX/Python原生方式(更简洁)
这种方式不需要numpy,直接筛选排序节点,代码更直观:
import networkx as nx N = 4 # 创建3D网格图 A = nx.grid_graph(dim=[N, N, N]) # 获取所有节点及其度数的列表,格式为[(节点元组, 度数), ...] node_degree_pairs = list(A.degree()) # 按节点度数从小到大排序(也可以reverse=True改成从大到小) node_degree_pairs.sort(key=lambda x: x[1]) # 筛选表面节点:3D网格中内部节点度数为6,度数<6的就是表面/边缘/角落节点 surface_nodes = [node for node, degree in node_degree_pairs if degree < 6]
方案2:结合numpy的实现(如果需要用numpy处理)
如果一定要用numpy,需要先把节点和度数转换成numpy数组,再通过掩码筛选,最后转成列表使用:
import networkx as nx import numpy as np from operator import itemgetter N = 4 A = nx.grid_graph(dim=[N, N, N]) # 把节点和度数分别转成numpy数组 nodes = np.array(list(A.nodes()), dtype=object) # 指定dtype=object存储元组 degrees = np.array(list(map(itemgetter(1), A.degree()))) # 生成筛选掩码:度数<=5的节点(表面节点) mask = degrees <= 5 # 筛选后转成列表,得到表面节点的元组列表 surface_nodes = nodes[mask].tolist()
错误原因拆解
你之前的代码里A.node[np.where(k <=...有两个问题:
- API过时:
A.node是旧版本NetworkX的写法,现在已经被替换为A.nodes(节点字典)或A.nodes()(节点迭代器); - 索引类型不匹配:
np.where()返回的是numpy索引数组,而NetworkX的节点字典键是元组(可哈希),用数组作为字典索引会被判定为"unhashable type",因为数组本身不可哈希。
内容的提问来源于stack exchange,提问作者Sofia Farina
相关产品推荐
相关产品推荐

