gpt4 book ai didi

python - 将 N 个元素按照桶大小的比例分配到 M 个不同大小的桶中

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:29 25 4
gpt4 key购买 nike

假设我有 N 个对象,我想将它们划分到 M 个不同大小的桶中。桶越大,它应该接收的对象就越多。

我目前已按如下方式解决了该问题,但对我来说似乎有些过分了。我现在正在使用 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)

我现在有了要放入 counts 内每个存储桶中的元素数量。

虽然这有效,但我感觉我应该能够更快地完成此操作,而无需生成 id 列表然后进行计数(和排序)。

想法?

编辑

作为引用,我找到了一个相应但更快的纯 numpy 解决方案。

_, counts = numpy.unique(numpy.random.choice(N, bucket_ratios), return_counts=True)

最佳答案

从问题中尚不清楚您是否想要随机分配,并且“存储桶大小”确定了分配到存储桶的相对概率。这种随机分布称为 multinomial distribution 。您可以使用 numpy.random.multinomial 从多项分布中抽取样本。例如:

In [32]: bucket_sizes
Out[32]: array([10, 7, 3, 20])

In [33]: N
Out[33]: 100

In [34]: p = bucket_sizes / float(bucket_sizes.sum())

In [35]: p
Out[35]: array([ 0.25 , 0.175, 0.075, 0.5 ])

In [36]: np.random.multinomial(N, p)
Out[36]: array([25, 24, 4, 47])

In [37]: np.random.multinomial(N, p)
Out[37]: array([32, 15, 8, 45])

关于python - 将 N 个元素按照桶大小的比例分配到 M 个不同大小的桶中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com