2012-12-05 6 views
0

У меня есть 10 бункеров:Python - Как сгенерировать индекс binning для списка?

bins = [0,1,2,3,4,5,6,7,8,9] 

У меня есть список из 25 значений:

values = [10,0,0,14,14,123,235,0,0,0,0,0,12,12,1235,23,234,15,15,23,136,34,34,37,45] 

Я хочу бункер значение последовательно в закрома таким образом каждое значение группируется в его бункер:

binnedValues = [[10,0],[0,14,14],[123,235],[0,0,0],[0,0],[12,12,1235],[23,234],[15,15,23],[136,34,34],[37,45]]

Как вы можете видеть, количество значений в бункере не всегда то же самое, (как len(values) != len(bins))

Кроме того, у меня есть множество различных списков значений, которые имеют разные размеры. Поэтому мне нужно сделать это несколько раз за одно и то же количество ящиков, но разные списки значений. Вышеприведенный пример - реальный размер бункера составляет 10 тыс., А реальная длина (значения) составляет от ~ 10 к до 750 тыс.

Есть ли способ сделать это последовательно? Мне нужно поддерживать порядок значений, но разделяйте список значений равномерно, чтобы было «справедливое» и «четное» количество диапазонов значений, распределенных по каждому из бункеров.

Я думаю, что я могу использовать numpy.digitize, но поглядев, я не могу видеть, как создать список «» Binned

+2

Что вы подразумеваете под биннинг значений последовательно? Вы можете уточнить? Размещение binnedValues ​​выглядит немного произвольно, за исключением того, что оно находится в том же порядке, что и исходный список. –

+0

Место размещения является суровым, поскольку я пытался продемонстрировать, чего я пытаюсь достичь. Если len (значения) = 20, то каждый бит будет иметь 2 значения. Если len (значения) = 30, то каждый бит будет иметь 3 значения. Я пытаюсь понять, как «равномерно» распределять значения в ящики, когда говорят len (values) = 27 (так что 7 бункеров будут иметь 3 значения, а 3 - 2) - как я могу равномерно распределять ящики разного размера в диапазон ящиков ... лучше? –

+0

Каков ваш ожидаемый результат, если у вас было 26 предметов? – sberry

ответ

1

Вы пытаетесь разделить этот список на списки размера чередуя 2 и 3 элемента? Тогда это выполнимо.

from itertools import cycle 

values = [10,0,0,14,14,123,235,0,0,0,0,0,12,12,1235,23,234,15,15,23,136,34,34,37,45] 
splits = cycle([2,3]) 
bins = [] 
count = 0 

while count < len(values): 
    splitby = splits.next() 
    bins.append(values[count:count+splitby]) 
    count += splitby 

print bins 

Edit:

Ах, я вижу, что вы запрашиваете ... вроде. Что-то подобное:

из itertools импорта цикла из математики импорта пол, CEIL

values = [10,0,0,14,14,123,235,0,0,0,0,0,12,12,1235,23,234,15,15,23,136,34,34,37,45] 
number_bins = 10 
bins_lower = int(floor(len(values)/float(number_bins))) 
bins_upper = int(ceil(len(values)/float(number_bins))) 

splits = cycle([bins_lower, bins_upper]) 
bins = [] 
count = 0 

while count < len(values): 
    splitby = splits.next() 
    bins.append(values[count:count+splitby]) 
    count += splitby 

print bins 

Если вы хотите больше разнообразия в размере бен, вы можете добавить другие номера в splits

Edit 2 :

Путь Эшвина, который является более кратким, не будучи более трудным для понимания.

from itertools import cycle, islice 
from math import floor, ceil 

values = [10,0,0,14,14,123,235,0,0,0,0,0,12,12,1235,23,234,15,15,23,136,34,34,37,45] 
number_bins = 10 
bins_lower = int(floor(len(values)/float(number_bins))) 
bins_upper = int(ceil(len(values)/float(number_bins))) 

splits = cycle([bins_lower, bins_upper]) 

it = iter(values) 
bins = [list(islice(it,next(splits))) for _ in range(10)] 
print bins 
+0

Это просто пример - реальный размер бункера составляет 10 тыс., А реальная длина (значения) составляет от ~ 10 тыс. До ~ 750 тыс. ... Я ценю ваш пример, хотя, извините, если я потратил ваше время на то, чтобы быть неясным! Я отредактирую главный пост. –

+0

Вау! это потрясающе.Как ты это сделал! (и так быстро!) –

+0

как насчет '[list (islice (it, next (split))) for _ in range (10)]', где 'it' is' iter (values) '. –

 Смежные вопросы

  • Нет связанных вопросов^_^