2017-01-03 82 views
1

我曾爲K最近鄰居製作函數。我已經分別測試了每個功能,並且它們都工作正常。然而,無論何時我將它們放在一起並運行KNN_method,它都會顯示unhashable type: 'numpy.ndarray'。 這裏是我的代碼:Python難以置信的類型:'numpy.ndarray'

def distance(p,point): 
    import numpy as np 
    value = np.sqrt(sum(np.power((p-point),2))) 
    return(value) 

def find_neighbors(p,list_of_points, k = 3): 
    import numpy as np 
    distances = np.zeros(list_of_points.shape[0]) 
    for i in range(list_of_points.shape[0]): 
     distances[i]= distance(p,list_of_points[i]) 
    ind = np.argsort(distances) 
    return(ind[0:k]) 

def majority_votes(votes): 
    import random 
    vote_result = {} 
    for key in votes: 
     if key in vote_result: 
      vote_result[key] += 1 
     else: 
      vote_result[key] = 1 
    final_list = [] 
    for (number, vote) in vote_result.items(): 
     if vote == max(vote_result.values()): 
      final_list.append(number) 
    Winner = random.choice(final_list) 
    return(Winner) 


def KNN_method(p , list_of_points , outcomes , k = 3): 
    ind = find_neighbors(p , list_of_points , k) 
    Final = majority_votes(outcomes[ind]) 
    return(Final) 
+2

我希望這只是一個練習。 Scipy已經優化了KNN功能和數據結構。還可以查看來自PyCon US 2016和SciPy 2016的Leland McInnes的hdbscan講座。https://www.youtube.com/watch?v=AgPQ76RIi6A https://github.com/lmcinnes/hdbscan – IceArdor

+0

像列表一樣,數組不能用作字典鍵。他們是可變的對象。字符串和元組是不可變的,並且作爲鍵。你真的需要使用一個數組作爲關鍵嗎? – hpaulj

+0

如果您提供了可以複製問題的示例輸入,並指定哪一行引發異常,這將有所幫助。 – jez

回答

4

轉換第一個元組。

hash(tuple(np.array([1,2,3,4]))) 
+0

謝謝,這工作! – Cantarella

+1

即使它似乎工作*,這是一個可怕的解決方案。 OP代碼中的真正問題是邏輯上的問題,數組幾乎不應該是字典的關鍵。將'A'看作一個numpy數組,如果'A'中的單個值發生了變化,它就不會與它最初分配的值相匹配。換句話說,除非你真的真的知道自己在做什麼(這看起來不是來自OP的代碼),你不應該使用可變對象(即使你可以散列它)作爲字典的關鍵字。 –

+0

我找到了一個快速簡單的解決方案。感謝你們提到可變對象。我將majority_votes中的選票轉換爲列表(選票),這使我可以將numpy數組轉換爲列表。通過這種方式,我可以訪問數組中的整數並將其用作字典中的鍵。 再次感謝! – Cantarella

相關問題