2017-04-21 59 views
1

我需要获得k大小的样本,而不从群体中取代,群体中的每个成员都具有相关的权重(W)。加密随机样本无需替换python

与NumPy的random.choices不会不更换执行此任务,并random.sample不会采取加权输入。

目前,这是我在用的:

P = np.zeros((1,Parent_number)) 
n=0 
while n < Parent_number: 
    draw = random.choices(population,weights=W,k=1) 
    if draw not in P: 
     P[0,n] = draw[0] 
     n=n+1 
P=np.asarray(sorted(P[0])) 

虽然这个工作,它reqires从阵列中来回切换,列表和回阵列和,因此,不太理想。

我在寻找最简单,最容易理解的解决方案,因为此代码将与其他人共享。

+2

“Numpy的random.choices不会执行这个任务没有替换” - 它是'numpy.random.choice',而不是选择,是的,如果你告诉它。 – user2357112

+0

你使用的是内置'random'模块而不是'numpy.random'吗? 'random.choices'不是一个NumPy的东西。 – user2357112

+0

奥普斯,是的,你是对的。我正在使用python随机模块。 –

回答

6

您可以使用np.random.choicereplace=False如下:

np.random.choice(vec,size,replace=False, p=P) 

其中vec是你的人口和P是权重向量。

例如:

import numpy as np 
vec=[1,2,3] 
P=[0.5,0.2,0.3] 
np.random.choice(vec,size=2,replace=False, p=P) 
1

对于numpy的,仪法伯的回答是要走的路。

对于纯蟒蛇,该技术是前体重的人口,然后用random.sample()无需更换提取值:

>>> # Extract 10 values without replacement from a population 
>>> # of ten heads and four tails. 
>>> from random import sample 
>>> population = ['heads', 'tails'] 
>>> counts = [10, 4] 
>>> weighted_pop = [elem for elem, cnt in zip(population, counts) for i in range(cnt)] 
>>> sample(weighted_pop, k=10) 
['heads', 'tails', 'tails', 'heads', 'heads', 'tails', 'heads', 'heads', 'heads', 'heads'] 

注意,权重是真正重要的。这非常重要,因为当您不更换样品时,每次选择都需要减少一个。