使用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
相关产品推荐
相关产品推荐

