Binning con generatori (grande insieme di dati; bin a larghezza fissa; float dati)
Se si conosce la larghezza dei contenitori desiderati prima del tempo - anche se ci sono centinaia o migliaia di secchi - Quindi penso che il rollover della propria soluzione sarebbe veloce (sia per scrivere che per eseguire). Ecco alcuni Python che presuppone che un iteratore che ti dà il valore successivo dal file:
from math import floor
binwidth = 20
counts = dict()
filename = "mydata.csv"
for val in next_value_from_file(filename):
binname = int(floor(val/binwidth)*binwidth)
if binname not in counts:
counts[binname] = 0
counts[binname] += 1
print counts
I valori possono essere galleggianti, ma questo sta assumendo si utilizza un binwidth intero; potrebbe essere necessario modificarlo leggermente se si desidera utilizzare una larghezza di banda di un valore float.
Per quanto riguarda next_value_from_file()
, come accennato in precedenza, probabilmente si vorrà scrivere un generatore personalizzato o un oggetto con un metodo iter() non farlo in modo efficiente.Il pseudocodice per un tale generatore sarebbe questo:
def next_value_from_file(filename):
f = open(filename)
for line in f:
# parse out from the line the value or values you need
val = parse_the_value_from_the_line(line)
yield val
Se una data linea ha più valori, quindi fare parse_the_value_from_the_line()
restituire un elenco o sé tramite un generatore, Utilizzando questo pseudocodice:
def next_value_from_file(filename):
f = open(filename)
for line in f:
for val in parse_the_values_from_the_line(line):
yield val
fonte
2013-12-29 14:55:13
Buona soluzione. Se vuoi renderlo un po 'più veloce, puoi fare 'myhist + = htemp' (penso che sia più veloce perché aggiorna l'istogramma in posizione). – EOL
Grazie a @EOL. Ho dimenticato alcune delle belle funzionalità di Python perché non sono completamente passato da Octave. E poi ci sono le funzionalità avanzate come i generatori che devo ancora imparare. – mtrw