1

私は10個のビンを持っています:

    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)

また、サイズの異なるさまざまな値のリストがたくさんあります。したがって、同じ数のビンに対してこれを何度も実行する必要がありますが、値リストの長さは異なります。上記は例です-実際のビンサイズは10kで、実際のlen(values)は〜10kから〜750kです。

これを一貫して行う方法はありますか?値の順序を維持する必要がありますが、値リストを均等に分割して、各ビンに分散される値の範囲の「公平」と「偶数」の数が存在するようにします。

numpy.digitizeを使用できると思いますが、見てみると、「ビニングされた」リストを生成する方法がわかりません。

4

1 に答える 1

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

編集:

ああ、あなたが何を求めているかわかりました... ある種。もっと似たもの:

itertools インポート サイクルから math インポート フロア、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

編集2:

Ashwin の方法。これは、理解しにくくすることなく、より簡潔です。

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
于 2012-12-05T05:02:54.037 に答える