Объединение с генераторами ( большой набор данных; ячейки фиксированной ширины; данные с плавающей запятой )
Если вы заранее знаете ширину желаемых корзин - даже если есть сотни или тысячи корзин - тогда я думаю, что развертывание вашего собственного решения будет быстрым (как для записи, так и для запуска). Вот некоторый Python, который предполагает, что у вас есть итератор, который дает вам следующее значение из файла:
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
Значения могут быть числами с плавающей точкой, но это предполагает, что вы используете целочисленную двоичную ширину; вам может понадобиться немного изменить это, если вы хотите использовать бинарную ширину некоторого значения с плавающей запятой.
Что касается next_value_from_file()
, как уже упоминалось ранее, вы, вероятно, захотите написать собственный генератор или объект с помощью метода iter (), который сделает это эффективно. Псевдокод для такого генератора будет следующим:
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
Если данная строка имеет несколько значений, тогда parse_the_value_from_the_line()
либо возвращает список, либо сам является генератором, и использует этот псевдокод:
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