Question

Je l'ai mis en valeur dans le flotteur (toujours inférieure à 0). Ce que je veux bin dans l'histogramme, c'est à dire. chaque barre de l'histogramme contient le choix de la valeur [0,0.150)

Les données que j'ai ressemble à ceci:

0.000
0.005
0.124
0.000
0.004
0.000
0.111
0.112

Whith mon code ci-dessous je me attends à obtenir le résultat qui ressemble à

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

J'ai essayé de ne faire une telle binning avec ce code de la mine. Mais il ne semble pas fonctionner. Quelle est la bonne façon de le faire?

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

~

Était-ce utile?

La solution

Si possible, ne pas réinventer la roue. NumPy a tout ce dont vous avez besoin:

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

Autres conseils

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

La première erreur est:

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

Pourquoi êtes-vous en train de convertir un int à une str lorsqu'une str est nécessaire? Résoudre ce problème, nous obtenons:

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

parce que vous avez seulement fait 5 seaux. Je ne comprends pas votre système de héliporté, mais nous allons le rendre 50 seaux et voir ce qui se passe:

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 est une valeur unique de votre liste de ints, alors qu'est-ce max ici? Retirez-le, maintenant, nous obtenons:

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

Effectivement, vous utilisez une seule valeur comme second argument à map. Simplifions les deux dernières lignes de ceci:

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

à ceci:

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

Maintenant, il imprime:

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

Je ne sais pas quoi faire d'autre ici, puisque je ne comprends pas vraiment le vous bucketing espérez utiliser. Il semble impliquer des pouvoirs binaires, mais est de ne pas me donner un sens ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top