在Numpy中生成唯一的随机值

时间:2020-06-18 07:27:14

标签: python pandas numpy

我尝试使用np.random.randint生成大量唯一的随机值,但返回的重复值很少。

我有以下数据集

District    Prefix  Quota       
A           98426   783
A           98427   223
A           98446   127
A           98626   51
B           98049   167
B           98079   153
B           98140   120
B           98159   139
B           98169   182
B           98249   86
B           98426   588
B           98446   96
C           98049   104
C           98060   68
C           98149   65
C           98150   68
C           98159   86
C           98160   80
C           98169   113

要复制的代码:

import pandas as pd
df = pd.DataFrame([
    ['A', 98426, 783],
    ['A', 98427, 223],
    ['A', 98446, 127],
    ['A', 98626, 51],
    ['B', 98049, 167],
    ['B', 98079, 153],
    ['B', 98140, 120],
    ['B', 98159, 139],
    ['B', 98169, 182],
    ['B', 98249, 86],
    ['B', 98426, 588],
    ['B', 98446, 96],
    ['C', 98049, 104],
    ['C', 98060, 68],
    ['C', 98149, 65],
    ['C', 98150, 68],
    ['C', 98159, 86],
    ['C', 98160, 80],
    ['C', 98169, 113]
], 
    columns=['District', 'Prefix', 'Quota'])

我必须创建一个唯一的随机数并将其添加到前缀中。随机值的数量以配额为单位

np.random.seed(1)  # for repeatability 
random=df.Prefix.repeat(df.Quota)*100000 + np.random.randint(0, 99999, df.Quota.sum())

我以为np.random.randint提供了唯一的数字,但是当生成大约18000个数字时,却提供了大约200个重复的数字。 最终我尝试了random.sample,问题得以解决。但是我想使用np.random.randit生成唯一编号,因为我可以在np.random.seed(n)中更改种子,并且可以通过更改种子来创建与第一组不同的另一组唯一编号。

1 个答案:

答案 0 :(得分:2)

您将无法直接与np.random.randint一起使用,因为它无法提供不替换而随机抽样 的可能性。但是np.random.choice确实如此。通过指定随机种子,您可以再现生成的序列,该序列将由range(99999)范围内的随机,均匀采样的分布数组组成:

np.random.seed(2)  
numbers = np.random.choice(range(99999), size=df.Quota.sum(), replace=False)
random = df.Prefix.repeat(df.Quota)*100000 + numbers

len(random)==random.nunique()
# True