假設我有N個對象,並且我想將它們劃分成不同大小的M個桶。桶越大,它應該接收的對象越多。將不同大小的M個桶中的N個元素按比例分配到桶大小
我目前已經解決了這個問題,如下所示,但對我來說看起來有點矯枉過正。我現在正在用python/numpy/scipy實現這個問題,而且這個代碼會在我的計算密集型科學應用程序中經常執行。
首先,我生成一個離散概率分佈:
bucket_sizes = numpy.array([10., 7., 3., 20.])
bucket_ratios = bucket_sizes/bucket_sizes.sum()
dist = scipy.stats.rv_discrete(values=(range(bucket_sizes.size), bucket_ratios))
然後,我生成N個樣本:
sample = dist.rcv(size=N)
最後,我算每個桶ID的出現在樣品中
bucket_id, counts = numpy.unique(sample, return_counts=True)
我現在可以在內的每個桶中放入元素的數量。
雖然這個工作,我覺得我應該能夠更快地做到這一點,而不生成id列表,然後計算(和排序)。
想法?
EDIT
作爲參考,我已發現對應的但快得多純numpy的溶液。
_, counts = numpy.unique(numpy.random.choice(N, bucket_ratios), return_counts=True)
是需求的隨機性部分嗎?或者,例如,如果有100個對象和兩個相同大小的桶,那麼總是會返回一個總是返回[50,50]的方法? –
在你的例子中是的。問題是如何用10個相同大小的桶來管理N = 7。 – marcorossi