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

使用NumPy数组做字典推导报错:TypeError: unhashable type: 'numpy.ndarray'

解决NumPy数组作为字典键的TypeError问题

嗨,这个问题我太熟啦!你碰到的TypeError: unhashable type: 'numpy.ndarray'报错,核心原因其实很好理解:

Python字典的键必须是可哈希(hashable)的类型,而NumPy数组(numpy.ndarray)是可变对象——你可以随时修改数组里的元素(比如a[0] = 5),这类可变对象没法被哈希,自然不能直接当字典的键。

给你几个实用的解决方案,按需选择:

方案1:用数组的变量名字符串当键(最推荐)

既然你已经给数组命名为a、b、c、d,直接用变量名的字符串作为键是最直观的:

{"a": a.shape, "b": b.shape, "c": c.shape, "d": d.shape}

如果数组数量多,还可以用locals()动态生成:

{name: val.shape for name, val in locals().items() if name in ["a", "b", "c", "d"]}

方案2:把数组转成可哈希类型(适合无固定变量名的场景)

如果必须用数组本身的内容来关联shape,可以把数组转换成不可变的可哈希类型:

  • 一维数组直接转元组:
{tuple(i): i.shape for i in [a, b, c, d]}
  • 多维数组可以先扁平化再转元组,或者用tobytes()(相同内容的数组会生成相同的bytes):
{tuple(i.flatten()): i.shape for i in [a, b, c, d]}
# 或者
{i.tobytes(): i.shape for i in [a, b, c, d]}

方案3:改用列表存储键值对(避开哈希限制)

如果不需要字典的查询特性,直接用列表存数组和shape的元组对也完全可以:

[(arr, arr.shape) for arr in [a, b, c, d]]

内容的提问来源于stack exchange,提问作者Dino Alessi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:38:10