k-means結果データフレームのエントロピーを取得しようとしていますが、エラーが戻ってきています:TypeError: 'numpy.int32'オブジェクトは反復不可能です 理由を理解できません。Python TypeError: 'numpy.int32'オブジェクトが反復可能ではありません
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']]
と、私はエラーメッセージが表示されます:
<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
'k_means_sp'が' numpy.int32'を保持していると仮定すると、 'numpy.int32'を' Counter'に渡しています。 'Counter 'は' iterable'を取るべきです。 –
私はクラスタの列をcluster = [0,1,2]とy = iter(cluster)にする必要がありますか、これを完全に間違っているのですか?ありがとう! – bananablue1
@ bananablue1これは、現在書かれているように、「calcEntropy」に整数を渡すことができないことを意味します。行うべき正しいことは、あなたの目標に依存します。 'calcEntropy'が整数で動作するようにしたい場合(それは意味がありますか?)、' calcEntropy'に何か他のものを渡したい場合は修正してください。 – Goyo