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

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 <=...有两个问题:

  1. API过时:A.node是旧版本NetworkX的写法,现在已经被替换为A.nodes(节点字典)或A.nodes()(节点迭代器);
  2. 索引类型不匹配:np.where()返回的是numpy索引数组,而NetworkX的节点字典键是元组(可哈希),用数组作为字典索引会被判定为"unhashable type",因为数组本身不可哈希。

内容的提问来源于stack exchange,提问作者Sofia Farina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:33