2016-06-13 7 views
1

私の次のコードは絶対に正しく動作しますが、出力が得られますが、centroids_listoflistsは変数エクスプローラに表示されず、print(centroids_listoflists)で呼び出すこともできません。Variable Explorer 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

varaibleは関数内に作成され、関数外には存在しません。あなたは、関数の外にそれを送信するために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は、関数の内部と外部同じ変数ではありませんが、それは同じ値(リストのリスト)に設定されますことを