Ошибка TypeError: нехешируемый тип: ‘numpy.ndarray’ обычно возникает, когда вы пытаетесь использовать NumPy ndarray в структуре данных, которая требует хешируемых элементов, таких как словарь или множество.
Воспроизведение ошибки
|
1 2 3 4 5 6 7 8 |
import numpy as np arr = np.array([11, 21, 19, 46]) my_dict = {} my_dict[arr] = "value" print(my_dict) |
Выход
|
1 |
TypeError: unhashable type: 'numpy.ndarray' |
В этом примере мы пытаемся использовать массив NumPy в качестве ключа словаря.
Numpy.ndarray имеет такие свойства, как форма, размер, ndim, dtype, data и dsize. Используя эти свойства, вы можете получить доступ к различным аспектам массива и изменить их.
Массивы NumPy являются изменяемыми объектами и, следовательно, не могут использоваться в качестве ключей словаря или элементов набора, которые должны быть неизменяемыми.
Поскольку массивы неизменяемы, мы не можем использовать их в качестве ключей словаря; следовательно, мы получаем TypeError.
Как исправить
Вот способы исправить ошибку TypeError: unhashable type: ‘numpy.ndarray’.
Решение 1. Преобразование массива numpy в кортеж
Преобразование массива NumPy в кортеж или список перед его использованием в качестве ключа словаря или элемента набора устранит ошибку TypeError.
Используйте функцию tuple() для преобразования массива в кортеж в Python.
|
1 2 3 4 5 6 7 8 9 10 |
import numpy as np arr = np.array([11, 21, 19, 46]) tup = tuple(arr) my_dict = {} my_dict[tup] = "value" print(my_dict) |
Выход
|
1 |
{(11, 21, 19, 46): 'value'} |
В этом примере мы преобразовали массив в хешируемый кортеж и использовали этот кортеж в качестве ключа к словарю, который не выдает ошибку, и устранили ошибку.
Решение 2. Используйте hashable в качестве ключа
Когда вы используете словарь или набор в Python, ключи или элементы должны быть хешируемыми объектами. Используйте другой тип объекта в качестве ключа или элемента. Например:
- Строки
- Целые числа
- Кортежи неизменяемых элементов (например, строк или целых чисел)
|
1 2 3 4 |
my_dict = {} my_dict[1] = "value" print(my_dict) |
Выход
|
1 |
{1: 'value'} |
Этот код использует целочисленный тип данных в качестве ключа к словарю, что полностью позволяет избежать ошибки TypeError.
Решение 3. Используйте собственный класс, определяющий __hash__ и __eq__
Если есть необходимость использовать массив NumPy в качестве ключа в словаре и вы не можете преобразовать его в кортеж или список, определите собственный класс, реализующий методы __hash__ и __eq__. Методы __hash__ и __eq__ позволяют вам определить, как должны хешироваться объекты.
Это решение встречается редко, и я рекомендую вам не использовать его без необходимости.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import numpy as np class CustomClass: def __init__(self, arr): self.arr = arr def __hash__(self): return hash(tuple(self.arr)) def __eq__(self, other): return np.array_equal(self.arr, other.arr) arr = np.array([11, 21, 19, 46]) key = CustomClass(arr) my_dict = {key: 'value'} print(my_dict) |
Выход
|
1 |
{<__main__.CustomClass object at 0x10234cfd0>: 'value'} |
