TypeError: unhashable тип: 'numpy .ndarray' в Python - PullRequest
0 голосов
/ 06 февраля 2020

Я читаю данные из набора данных, содержащего точки на плоскости. Каждая точка имеет координаты x и y.

with open('SJC324.txt') as f:
    data=[]
    for line in f:
        x,y=(line.strip('\n').split())
        data.append([int(x),int(y)])
    initialisation(data)

Затем я сделал K-medoid кластеризацию на этих точках. Я сохранил Medoid точек в списке. Затем я проверю, какие точки лежат в пределах определенного c радиуса от медоидов. Таким образом, я вычисляю покрытие.

def initialisation(data):
    data=np.array(data)
    D=pairwise_distances(data,metric='euclidean')
    coverage=[]
    for i in range(20):
        covered_point=set()
        M, C = kmedoids.kMedoids(D, len(data)//15)
        medoid=data[M]
        for temp in medoid:
            for x in data:
                if check_within_radius(temp,x):
                    covered_point.add(x)
        coverage.append((len(covered_point)/len(data))*100)
    print(coverage)

Здесь я проверяю, какие точки лежат в пределах указанного c радиуса этих медоидов.

def check_within_radius(temp,x):
    #temp is medoid point
    #x is any random point
    radius=10
    if (((temp[0]-x[0])**2) + ((temp[1]-x[1])**2))< radius*radius:
        return True
    else:
        return False

Теперь я получаю следующую ошибку.

<ipython-input-23-d04cdfb631a8> in initialisation(data)
     16             for x in data:
     17                 if check_within_radius(temp,x):
---> 18                     covered_point.add(x)
     19         coverage.append((len(covered_point)/len(data))*100)
     20     print(coverage)

TypeError: unhashable type: 'numpy.ndarray'

1 Ответ

0 голосов
/ 06 февраля 2020

Вы пытаетесь найти уникальные элементы в списке 2D. Вы можете немного изменить свой код.

from collections import Counter

temp = Counter([tuple(x) for x in covered_point])
#Counter will count the frequency of each element(1D list) in a 2D list

z = [list(k) for k, v in temp.items() if v >= 1]
'''
 When one element(1D list) appears more than once in that 2D list you are
 taking that only  one time.
'''

coverage.append((len(z)/len(data))*100)
...