Domanda

ho impostato di valore nel galleggiante (sempre inferiore a 0). Che voglio bin in istogramma, I, E. ciascuna barra istogramma contiene gamma di valore [0,0.150)

I dati che ho è simile al seguente:

0.000
0.005
0.124
0.000
0.004
0.000
0.111
0.112

Whith il mio codice qui sotto mi aspetto di ottenere il risultato che appare come

[0, 0.005) 5
[0.005, 0.011) 0
...etc.. 

Ho cercato di fare che fare tale categorizzazione con questo codice di mine. Ma non sembra funzionare. Qual è il modo giusto per farlo?

#! /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])))

~

È stato utile?

Soluzione

Quando possibile, non reinventare la ruota. NumPy ha tutto il necessario:

#!/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]

Altri suggerimenti

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()

Il primo errore è:

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

Perché stai convertendo un int ad una str quando è necessaria una str? Rimediare, allora otteniamo:

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

perché hai fatto solo 5 secchi. Non capisco il vostro schema di bucket, ma cerchiamo di renderlo 50 secchi e vedere cosa succede:

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 è un singolo valore dalla vostra lista di int, quindi qual è max fa qui? Rimuoverlo, ora otteniamo:

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

Certo, basta, si sta utilizzando un singolo valore come secondo argomento a map. Diamo semplificare le ultime due righe da questo:

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

a questo:

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

Ora la stampa:

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

Non sono sicuro che altro da fare qui, dal momento che non capisco il bucket si spera di utilizzare. Sembra coinvolgere poteri binari, ma non sta facendo senso per me ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top