2017-08-23 5 views
-1

J'essaye de prendre l'entropie de mes données de résultat k-means et je reçois l'erreur: TypeError: l'objet 'numpy.int32' n'est pas itérable I ne comprends pas pourquoi.Python TypeError: l'objet 'numpy.int32' n'est pas itérable

from collections import Counter 
def calcEntropy(x): 
    p, lens = Counter(x), np.float(len(x)) 
    return -np.sum(count/lens*np.log2(count/lens) for count in p.values()) 
k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

puis je reçois le message d'erreur:

<ipython-input-26-d375ecf00330> in <module>() 
----> 1 k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

<ipython-input-26-d375ecf00330> in <listcomp>(.0) 
----> 1 k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

<ipython-input-23-f5508ea8782c> in calcEntropy(x) 
     1 from collections import Counter 
     2 def calcEntropy(x): 
----> 3  p, lens = Counter(x), np.float(len(x)) 
     4  return -np.sum(count/lens*np.log2(count/lens) for count in p.values()) 

/Users/mpiercy/anaconda/lib/python3.6/collections/__init__.py in __init__(*args, **kwds) 
    535    raise TypeError('expected at most 1 arguments, got %d' % len(args)) 
    536   super(Counter, self).__init__() 
--> 537   self.update(*args, **kwds) 
    538 
    539  def __missing__(self, key): 

/Users/mpiercy/anaconda/lib/python3.6/collections/__init__.py in update(*args, **kwds) 
    622      super(Counter, self).update(iterable) # fast path when counter is empty 
    623    else: 
--> 624     _count_elements(self, iterable) 
    625   if kwds: 
    626    self.update(kwds) 

TypeError: 'numpy.int32' object is not iterable 

k_means_sp.head() 

     credit debit cluster 
0 9.207673 8.198884 1 
1 4.248495 8.202181 0 
2 8.149668 7.735145 2 
3 5.138677 7.859741 0 
4 8.058163 7.918614 2 
+1

en supposant que 'k_means_sp' contient 'numpy.int32', alors vous passez un' numpy.int32' à 'Counter'. 'Counter' devrait prendre un' iterable'. –

+0

qu'est-ce que cela signifie que je devrais faire la colonne de cluster soit cluster = [0,1,2] et y = iter (cluster) ou est-ce que je fais cela complètement faux? Merci! – bananablue1

+0

@ bananablue1 Cela signifie que vous ne pouvez pas passer un nombre entier à 'calcEntropy' tel qu'il est actuellement écrit. La bonne chose à faire dépend de votre objectif. Si vous voulez que 'calcEntropy' fonctionne avec des entiers (cela a-t-il un sens?) Alors vous devez le réparer, si vous voulez passer quelque chose d'autre à' calcEntropy', puis passer autre chose, etc. – Goyo

Répondre

0

Ok c'est une première tentative. Il semble que votre base de données stocke l'index de cluster dans la colonne 'cluster'. Donc ce que vous devez faire est d'obtenir chaque groupe en fonction de l'indice, puis passer cette grappe à votre fonction calcEntropy, quelque chose comme

for i in xrange(len(k_means_sp['cluster'].unique())) # loop thru cluster indices: 
    cluster = k_means_sp.ix[k_means_sp['cluster'] == i][['credit', 'debit']] 
    entropy = calcEntropy(cluster) 

La deuxième ligne filtre les lignes à seulement ceux qui ont le même groupe indice. est-ce que cela aide?

+0

oui merci beaucoup! – bananablue1