파이썬에서 TypeError : 해시 할 수없는 유형 : 'numpy.ndarray'

Aug 19 2020

리콜을 찾으려고했지만 유형 오류가 발생합니다.

import pandas as pd
y_test = {'o1':  [0,1,0,1],'o2': [1,1,0,1],'o3':[0,0,1,1]}
y_test = pd.DataFrame (y_test)
y_pred = {'o1':  [1,1,0,1],'o2': [1,0,0,1],'o3':[1,0,1,1]}
y_pred = pd.DataFrame (y_pred)
y_pred = y_pred.to_numpy()


def precision(y_test, y_pred):
    i = set(y_test).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1

print("recall of Binary Relevance Classifier: " + str(precision(y_test, y_pred)))

이 코드는 오류를 표시했습니다. 실제로 아래에서 다중 레이블 분류 오류 세부 정보에 대한 회수를 찾으려고합니다.

TypeError                                 Traceback (most recent call last)
<ipython-input-41-8f3ca706a8e6> in <module>
16         return len(i) / len1
17 
---> 18 print("recall of Binary Relevance Classifier: " + str(precision(y_test, y_pred)))
<ipython-input-41-8f3ca706a8e6> in precision(y_test, y_pred)
 9 
10 def precision(y_test, y_pred):
---> 11     i = set(y_test).intersection(y_pred)
 12     len1 = len(y_pred)
 13     if len1 == 0:

TypeError: unhashable type: 'numpy.ndarray'

답변

1 CarolynConway Aug 19 2020 at 20:14

y_test배열이 2 차원이기 때문에 numpy 배열 을 집합 (11 행)으로 변환 할 수 없습니다.

iterable이 집합으로 변환 되려면 항목이 모두 해시 가능해야합니다. 숫자가 해시 가능하기 때문에 1d numpy 배열의 경우 괜찮습니다.

>>> array_1d = np.array([1, 2, 3])
>>> array_1d
array([1, 2, 3])
>>> set(array_1d)
{1, 2, 3}

그러나 2 차원 배열의 경우 중첩 배열 자체가 해시 할 수 없기 때문에이 오류가 발생합니다.

>>> array_2d = np.array([[1,2,3], [1,2,3], [1,2,3]])
>>> array_2d
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])
>>> set(array_2d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'numpy.ndarray'