2012-09-08 65 views
0

我想從許多集合中選擇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的列表?

+0

什麼是更好的:float(i)或1.0 * i? –

+0

'1.0 * i'與float(i)'有不同的含義。所以如果你想轉換爲float,你應該使用'float(i)'。 – Bakuriu

+0

@Bakuriu:那麼如果'i'是整數,那麼最終的區別究竟是什麼? – gorlum0

回答

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個元素。

0

除非一些非常具體的條件通過每個集合中的圖像數量和所需的數量來滿足,否則總體上不可能總數爲15(或任何你想要的)和正確的比例。

所以,你需要決定如何調整這些數字,以獲得接近你想要的東西。你想要的比例幾乎是正確的(即使現在它只是「接近」,因爲你已經四捨五入了)?或者你想要允許總數以外的數字?

也:

total_images = sum(image_counts) 
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:])