2009-11-12 14 views
8

Floatta (her zaman 0'dan az) bir değer kümesi var. Histogram içine binmek istediğim, i, e. histogramda her çubuk değerinin aralığını ihtiva [0,0.150)Python'da histogramdaki float değerleri nasıl oluşur?

Ben veri şuna benzer: Benim kod Whith

0.000 
0.005 
0.124 
0.000 
0.004 
0.000 
0.111 
0.112 

Ben

[0, 0.005) 5 
[0.005, 0.011) 0 
...etc.. 
benziyor sonuç almak için beklemek altında

Bu kodla böyle bir şey yapmaya çalıştım. Ama işe yaramıyor. Bunu yapmanın doğru yolu nedir?

#! /usr/bin/env python 


import fileinput, math 

log2 = math.log(2) 

def getBin(x): 
    return int(math.log(x+1)/log2) 

diffCounts = [0] * 5 

for line in fileinput.input(): 
    words = line.split() 
    diff = float(words[0]) * 1000; 

    diffCounts[ str(getBin(diff)) ] += 1 

maxdiff = [i for i, c in enumerate(diffCounts) if c > 0][-1] 
print maxdiff 
maxBin = max(maxdiff) 


for i in range(maxBin+1): 
    lo = 2**i - 1 
    hi = 2**(i+1) - 1 
    binStr = '[' + str(lo) + ',' + str(hi) + ')' 
    print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 

~

+0

Eh, [0, 0,005 olarak tanımlanan aralıklar) (sağ açık) ve varsa, "Sen ... beklediğiniz" örneğinde [0.005, 0.011) (kapalı sola) daha sonra çıkış olmalıdır: [0, 0.005] 4 [0.005, 0.011) 1 vb ... – Gacek

+0

"Çalışmıyor gibi görünüyor mu?" Herhangi bir özel şikayet? Ya da herkesin onu çalıştırması ve çıktının neyi sevmediğini tahmin etmesini bekler misiniz? –

+0

Tekerleği yeniden icat etmekten kaçınmak için, özellikle bir sonraki adım histogramınızı çiziyorsa: Tüm bunları ele alan Matplotlib çerçevesini kullanmayı düşünmelisiniz. – RedGlyph

cevap

13

Mümkün olduğunda, tekerleği yeniden icat etmeyin. NumPy gereken her şeyi vardır:

#!/usr/bin/env python 
import numpy as np 

a = np.fromfile(open('file', 'r'), sep='\n') 
# [ 0.  0.005 0.124 0.  0.004 0.  0.111 0.112] 

# You can set arbitrary bin edges: 
bins = [0, 0.150] 
hist, bin_edges = np.histogram(a, bins=bins) 
# hist: [8] 
# bin_edges: [ 0. 0.15] 

# Or, if bin is an integer, you can set the number of bins: 
bins = 4 
hist, bin_edges = np.histogram(a, bins=bins) 
# hist: [5 0 0 3] 
# bin_edges: [ 0.  0.031 0.062 0.093 0.124] 
+0

Ve normalleştirilmiş bir histogram istiyorsanız, şu satırı ekleyebilirsiniz: hist = hist * 1.0/sum (hist) – dval

+0

Ve bin aralığındaki integralin 1 olmasını istiyorsanız, ['yoğunluk = Doğru '] kullanın (http://docs.scipy.org/doc/numpy-1.10.1/reference/ oluşturulan/numpy.histogram.html). – unutbu

2

ilk hatadır: Bir str gerektiğinde

Traceback (most recent call last): 
    File "C:\foo\foo.py", line 17, in <module> 
    diffCounts[ str(getBin(diff)) ] += 1 
TypeError: list indices must be integers 

Neden str için bir int dönüştürebiliyor musunuz? o Fix, daha sonra elde ederiz:

Traceback (most recent call last): 
    File "C:\foo\foo.py", line 17, in <module> 
    diffCounts[ getBin(diff) ] += 1 
IndexError: list index out of range 

sadece 5 kovayı yaptık çünkü. Ben senin bucketing düzeni anlıyorum ama hadi 50 kova yapmak ve ne olduğunu görmesine izin verme:

6 
Traceback (most recent call last): 
    File "C:\foo\foo.py", line 21, in <module> 
    maxBin = max(maxdiff) 
TypeError: 'int' object is not iterable 

maxdiff, ints listenizin dışına tek değerdir yüzden burada ne max nedir? şimdi alırsak alalım, bunu kaldırın: Yeterince

6 
Traceback (most recent call last): 
    File "C:\foo\foo.py", line 28, in <module> 
    print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 
TypeError: argument 2 to map() must support iteration 

Tabii, map ikinci argüman olarak tek bir değer kullanıyoruz. Buna

binStr = '[' + str(lo) + ',' + str(hi) + ')' 
print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 

:

print "[%f, %f)\t%r" % (lo, hi, diffCounts[i]) 

Şimdi yazdırır: Şimdi, bunun son iki satırı basitleştireyim

6 
[0.000000, 1.000000) 3 
[1.000000, 3.000000) 0 
[3.000000, 7.000000) 2 
[7.000000, 15.000000) 0 
[15.000000, 31.000000) 0 
[31.000000, 63.000000) 0 
[63.000000, 127.000000) 3 

I 'olmuş, burada yapılacak başka ne emin değilim kullanmayı umduğun kovalamayı anlamıyorum. İkili güçleri içeriyor gibi görünüyor, ama bana mantıklı değil ...

3
from pylab import * 
data = [] 
inf = open('pulse_data.txt') 
for line in inf: 
    data.append(float(line)) 
inf.close() 
#binning 
B = 50 
minv = min(data) 
maxv = max(data) 
bincounts = [] 
for i in range(B+1): 
    bincounts.append(0) 
for d in data: 
    b = int((d - minv)/(maxv - minv) * B) 
    bincounts[b] += 1 
# plot histogram 

plot(bincounts,'o') 
show() 
İlgili konular