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]

我想将这些值按顺序放入 bin 中,以便将每个值分组到其 bin 中:

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]]

如您所见,bin 中的值的数量并不总是相同的,(如len(values) != len(bins)

另外,我有很多不同大小的值列表。所以我需要对相同数量的 bin 执行此操作多次,但值列表长度不同。上面是一个例子——真实的 bin 大小是 10k,真实的 len(values) 是从 ~10k 到 ~750k..

有没有办法始终如一地做到这一点?我需要保持值的顺序,但平均拆分值列表,以便分配到每个箱的值范围的“公平”和“偶数”数量。

我想我可以使用 numpy.digitize,但是看过之后,我看不到如何生成“binned”列表

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 导入周期从数学导入地板,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

如果您想要更多种类的 bin 大小,可以添加更多数字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 回答