采取比例样本,没有不良的采样

时间:2012-09-08 08:21:05

标签: python algorithm

我想从许多系列中选择15张图片。图像数量取决于该集合中图像的比例。

我的代码如下:

image_counts = [16, 2, 14]
total_images = 0
for i in image_counts:
    total_images += i
proportions = [1.0 * i / total_images for i in image_counts]
counts = [int( round( 15 * i)) for i in proportions]

但由于四舍五入,输出[8, 1, 7]加起来为16。如何获得恰好合计15的列表?

3 个答案:

答案 0 :(得分:1)

您的一个选择是:

image_counts = [16, 2, 14]
total_images = sum(image_counts)

proportions = [1.0 * i / total_images for i in image_counts]
counts = [int(15 * i) for i in proportions]
if sum(counts) < 15:
    counts[counts.index(min(counts))] += 1

要完成此答案:

counts[counts.index(min(counts))] += 15 - sum(counts[1:]) # from user1654936

并将最终列表截断为15个元素。

答案 1 :(得分:1)

在大多数情况下,无法根据计算的比例精确选择计数。所以,因为你必须偏离比例,你可以改变,例如,您的counts列表的第一个数字,以便它总计所需的总数:

image_counts = [16, 2, 14]
total_images = sum(image_counts)
proportions = [1.0 * i / total_images for i in image_counts]
counts = [int( round( 15 * i)) for i in proportions]
counts[0] = 15 - sum(counts[1:])

答案 2 :(得分:0)

除非某些非常具体的条件通过每个集合中的图像数量和您想要的数量得到满足,否则您通常不能总计15(或任何您想要的)和正确的比例。

因此,您需要决定如何调整这些数字以获得接近您想要的数字。你想要比例几乎是正确的(即使现在它只是“接近”,因为你已经四舍五入)?或者您想要允许总数不超过15的数字?

也:

total_images = sum(image_counts)