2016-06-13 80 views
1

我的下面的代碼工作絕對正確,我甚至得到一個輸出,但centroids_listoflists不會出現在變量資源管理器中,我也不能用print(centroids_listoflists)記得它。可變資源管理器Spyder

import numpy as np 

data = np.random.choice(2,size=(10, 5)) 
centroids=data[np.random.choice(data.shape[0], 2)] 
#We have random binary data; here 10 observation vectors with length 5 
#Out of these data we choose randomly 2 centroids to work with 
print ("Here are the centroids:") 
print (centroids) 
print ("Here is the data:") 
print (data) 

distance_array =np.full((data.shape[0],2),data.shape[1]) 
distance_array[:,1]=0 
distance_array=distance_array.astype(np.int) 

#determine the hamming distance to each centroid and save the smallest one 

def compare(centroids,data): 
    for a in range(data.shape[0]): 
     for b in range(centroids.shape[0]): 
      distance = 0 
      for i in range(data.shape[1]): 
       if (data[a][i] != centroids[b][i]): 
        distance +=1 
       else: 
        distance +=0 
      if (distance <= distance_array[a,0]): 
       distance_array[a,0] = distance 
       distance_array[a,1] = b 
      else: 
       pass 

compare(centroids,data) 

print ("Here are the distances:") 
print (distance_array) 

#create a LookupTable which tells me which centroid contains which vectors and with what distance 

def create_centroids_listoflists(data,distance_array,centroids): 
    centroids_listoflists = [ [] for i in range(centroids.shape[0])] 
    for a in range(len(centroids_listoflists)): 
     for b in range(len(distance_array)): 
      if (a == distance_array[b,1]): 
       centroids_listoflists[a].append((distance_array[b,1],data[b])) 
      else: 
       pass 
    print(centroids_listoflists) 

print ("LookupTable for centroid,data and distance:")    
create_centroids_listoflists(data,distance_array,centroids) 

會很高興,如果你能告訴我,爲什麼它不工作... 我覺得有什麼不對的一部分功能create_centroids_listoflists的定義。

謝謝!

回答

0

我不知道爲什麼,但如果你在函數內部創建一個變量,它將是一個局部變量,因此你不能在以後調用它。我通過在進入定義的函數之前初始化列表(或變量)來解決問題。然後它將被保存爲一個全局變量,並且也可以在變量瀏覽器中使用。

最好的問候和感謝您的幫助。

0

變量是在函數內部創建的,並且不在函數外部存在。您應該使用return語句來發送你的函數之外:

def create_centroids_listoflists(data,distance_array,centroids): 
    centroids_listoflists = [ [] for i in range(centroids.shape[0])] 
    for a in range(len(centroids_listoflists)): 
     for b in range(len(distance_array)): 
      if (a == distance_array[b,1]): 
       centroids_listoflists[a].append((distance_array[b,1],data[b])) 
      else: 
       pass 
    return centroids_listoflists 

print ("LookupTable for centroid,data and distance:")    
centroids_listoflists = create_centroids_listoflists(data,distance_array,centroids) 
print(centroids_listoflists) 

注意centroids_listoflists不是內部和函數外部相同的變量,但它被設置爲相同的值(名單列表)