Agrupación con los generadores de (gran conjunto de datos; contenedores de ancho fijo; flotar datos)
Si conoce el ancho de los contenedores deseados antes de tiempo - incluso si hay cientos o miles de cubos - Entonces creo que rodar tu propia solución sería rápido (tanto para escribir como para ejecutar). Aquí hay algo de Python que se supone que tiene un iterador que le da el siguiente valor del archivo:
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
Los valores pueden ser flotadores, pero esto es suponiendo que se utiliza un número entero binwidth; Es posible que necesite modificar esto un poco si desea utilizar un ancho de banda de algún valor flotante.
En cuanto a next_value_from_file()
, como se mencionó anteriormente, es probable que desea escribir un generador personalizado o un objeto con un método iter() no hacer esto de manera eficiente.El pseudocódigo para un generador de este tipo sería la siguiente:
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
Si una línea dada tiene múltiples valores, a continuación, hacer parse_the_value_from_the_line()
o bien devolver una lista o ser en sí mismo un generador, y utilizar este pseudocódigo:
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
Buena solución. Si quieres hacerlo un poco más rápido, puedes hacer 'myhist + = htemp' (supongo que es más rápido porque actualiza el histograma en su lugar). – EOL
Gracias @EOL. Olvidé algunas de las bonitas funciones de Python porque no cambié completamente de Octave. Y luego están las características avanzadas como generadores que aún tengo que aprender. – mtrw