2017-03-29 17 views
0

辞書内の値の出現率を計算したいと思います。 d.values/sum(d.values)*100それはエラーを返します:unsupported operand type(s) for /: 'list' and 'int'あなたは任意の整数でリスト全体を分割することはできません。私は思って、私はあなたがパーセンテージを計算することができますがカウントした時点でd =(Counter([Counter(i)['1'] for i in f.readlines()]))としようとしましたが、それは動作しませんでした。誰かがアイデアを持っているなら、私に知らせてください。Python辞書の割合を計算する

from collections import Counter 
import numpy as np 
import matplotlib.pyplot as plt 
import pylab as pl 
with open("data_binary.txt") as f: 
    d=(Counter([Counter(i)['1'] for i in f.readlines()])) 
    print d 

    p = d.values() 
    X = np.arange(len(d)) 
    pl.bar(X, p, align='center',width=0.25) 
    a = np.array(d.items()) 
    pl.xticks(X,d.keys()) 
    a = a[np.argsort(a[:,0])] 
    #print a 
    ymax=max(d.values())+1 
    pl.ylim(0, 70000) 
    plt.xlabel ("Number of ones") 
    plt.ylabel ("Number of Signatures") 
    plt.title("[email protected]") 
    pl.show() 
+0

は、例えば、。どのように辞書のように見える? – AceLearn

+0

'np.fromfile'(バイナリの場合)または' np.loadtxt'を使用して 'np.array'に直接データをロードするのはなぜですか? – Crispin

答えて

0

何か不足している場合を除き、len(d.values())を使用してアイテムの数を取得することをお勧めします。あなたは辞書(d)がどのように見えるか教えていただけますか? (すなわち、印刷dの出力)

0

リストコンプを使用できます。

In[2]: my_dict = {key: key for key in range(5)} 
In[3]: values = my_dict.values() 
In[4]: values 
Out[4]: [0, 1, 2, 3, 4] 
In[5]: total = sum(values) 
In[6]: new = [value * 100./total for value in values] 
In[7]: new 
Out[7]: [0.0, 10.0, 20.0, 30.0, 40.0] 

か、値が整数である任意の辞書Dについては、

In[8]: import numpy as np 
In[9]: x = np.array([1, 2, 3, 4]) 
In[10]: x 
Out[10]: array([1, 2, 3, 4]) 
In[11]: x/3.4 
Out[11]: array([ 0.29411765, 0.58823529, 0.88235294, 1.17647059]) 
0

使用numpyの

x = np.array(d.values()) 
print x*100.0/sum(x) 
0

をnp.array使用することができ、全体に占める割合は、それぞれの項目によって表されることができます次のように計算して印刷する:

s = sum(d.values()) 
for k, v in d.items(): 
    pct = v * 100.0/s 
    print(k, pct) 

これは、numpyが残念であり、辞書ではなく配列用に最適化されています。