TypeError: нехешируемый тип: 'numpy.ndarray' в массиве для установки

в этом определении я получаю TypeError: unhashable type: 'numpy.ndarray' в строке

def evaluate_retrieval(query_idx, retrieved_indices, relevant_indices):
    # Convert each list element to a tuple
    # Flatten the two-layer list and convert elements to tuples
    arr = np.array(retrieved_indices) #retrieved_indices => 128 * 128 * 3

# Transpose the array and convert it to a list of tuples
    retrieved_indices = tuple(list(map(tuple, np.vstack(arr.T))))
    print(type(retrieved_indices))

# Create a set from the tuples
    retrieved_indices_set = set(retrieved_indices)
    relevant_retrieved = len(retrieved_indices_set.intersection(relevant_indices_set))
    precision = relevant_retrieved / len(retrieved_indices_set) if len(retrieved_indices_set) > 0 else 0
    return precision

I try this but didn't work
retrieved_indices_tuples = tuple(tuple(tuple(pixel) for pixel in row) for row in retrieved_indices)

Python не позволяет массивам numpy быть элементами наборов или ключами хеш-таблиц. По той же причине он не позволяет словарям или спискам быть элементами наборов или ключей хеш-таблиц. Это изменяемые объекты. Если вам нужен ключ, сделайте что-то полностью неизменяемым.

Frank Yellin 19.06.2024 23:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Невозможно преобразовать элементы numpy.ndarray напрямую в набор. Вам необходимо преобразовать numpy.ndarray в хешируемый тип, например кортеж.

Что-то вроде этого:

import numpy as np

def evaluate_retrieval(query_idx, retrieved_indices, relevant_indices):
    retrieved_indices_tuples = tuple(tuple(tuple(pixel) for pixel in row) for row in retrieved_indices)
    
    retrieved_indices_set = set(retrieved_indices_tuples)
    
    relevant_indices_set = set(relevant_indices)
    
    # Calculate the intersection of the sets
    relevant_retrieved = len(retrieved_indices_set.intersection(relevant_indices_set))
    
    precision = relevant_retrieved / len(retrieved_indices_set) if len(retrieved_indices_set) > 0 else 0
    
    return precision

retrieved_indices = np.random.randint(0, 256, (128, 128, 3))  # Sample data
relevant_indices = [((0, 0, 0), (1, 1, 1), (2, 2, 2))]  # Sample relevant indices

precision = evaluate_retrieval(0, retrieved_indices, relevant_indices)
print(f"Precision: {precision}")
Ответ принят как подходящий

Я решил эту проблему таким образом:

retrieved_indices_tuples = tuple(
    tuple(
        tuple(
            tuple(pixel) for pixel in slice
        ) for slice in row
    ) for row in retrieved_indices
)
    print(type(retrieved_indices_tuples))  # Should print <class 'tuple'>
    print(type(retrieved_indices_tuples[0]))  # Should print <class 'tuple'>
    print(type(retrieved_indices_tuples[0][0]))  # Should print <class 'tuple'>
    print(type(retrieved_indices_tuples[0][0][0]))  # Should print <class 'tuple'>
    print(type(retrieved_indices_tuples[0][0][0][0])) # Should print <class 'int'>

Другие вопросы по теме