TypeError: unhashable type: 'numpy.ndarray'报错
时间: 2024-09-14 11:00:18 浏览: 62
`TypeError: unhashable type: 'numpy.ndarray'` 这个错误通常发生在你尝试将一个 NumPy 数组(`numpy.ndarray`)用作字典的键或者尝试将其加入到集合中时。在 Python 中,字典的键和集合的元素都必须是可哈希的。一个对象是可哈希的,意味着它可以产生一个哈希值,该值在对象的生命周期内不会改变,并且对象在比较时如果相等,那么它们的哈希值也必须相等。
然而,NumPy 数组默认是不可哈希的,因为它们的大小、形状和内容可能会变化,导致它们的哈希值也会变化。如果你需要将数组用于字典键或加入到集合中,你可以将数组转换为不可变的类型,比如元组,这样它们就可以被哈希。例如:
```python
import numpy as np
# 创建一个 NumPy 数组
arr = np.array([1, 2, 3])
# 尝试直接使用数组作为字典键会引发错误
# dict_example = {arr: "some value"}
# 使用数组内容转换为元组作为键
tuple_from_arr = tuple(arr)
dict_example = {tuple_from_arr: "some value"}
```
相关问题
yolov8 TypeError: unhashable type: 'numpy.ndarray'
当你遇到`TypeError: unhashable type: 'numpy.ndarray'`这样的错误时,这通常发生在尝试将Python字典或集合(它们需要是可哈希的)中包含`numpy.ndarray`对象的时候。`numpy.ndarray`是不可哈希的,因为其内容可以改变,导致每个实例的标识符不会保持不变。
在YOLOv8(You Only Look Once Version 8)这类深度学习框架中,这个错误可能出现在某些函数期待一个可以作为键(key)的值,而`numpy.array`却被用于这种位置。常见的解决办法包括:
1. **转换数组**:在需要哈希的地方,你可以先将`numpy.array`转换为列表或其他可哈希的数据结构,如元组,然后再将其用作键。
```python
arr = np.array([...])
hash_key = tuple(arr.tolist()) # 将数组转换为元组并存储
```
2. **避免直接作为键**:如果不需要使用字典或集合,可以直接操作数组本身,而不必强制将其变成键。
3. **检查文档和源码**:查看YOLOv8的相关部分,看是否有特别的输入规范或说明是否允许`numpy.ndarray`作为函数参数。
TypeError: unhashable type: 'numpy.ndarray'
这个错误通常发生在试图将 Numpy 数组用作字典的键或集合的元素时。因为 Numpy 数组是可变对象,而 Python 字典和集合要求键和元素必须是不可变对象,否则无法进行哈希。
要解决这个错误,可以将 Numpy 数组转换为元组或其他不可变对象作为键或元素。例如,如果有一个形状为 (3, 3) 的 Numpy 数组 arr,可以使用 tuple(arr) 将其转换为元组。
以下是一个示例代码,演示了如何解决这个错误:
```python
import numpy as np
# 一个 Numpy 数组作为字典的键会引发 TypeError
arr = np.array([1, 2, 3])
d = {arr: 1} # 报错:TypeError: unhashable type: 'numpy.ndarray'
# 将 Numpy 数组转换为元组作为键
arr_tuple = tuple(arr)
d = {arr_tuple: 1} # 正常运行
# 一个 Numpy 数组作为集合的元素也会引发 TypeError
s = {arr} # 报错:TypeError: unhashable type: 'numpy.ndarray'
# 将 Numpy 数组转换为元组作为集合的元素
s_tuple = {tuple(arr)} # 正常运行
```
阅读全文