【问题标题】:Generating unique random value in Numpy在 Numpy 中生成唯一的随机值
【发布时间】:2020-06-18 07:27:14
【问题描述】:

我尝试使用 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) 中的种子,并且可以通过更改种子创建与第一组不同的另一组唯一数字。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您将无法直接使用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
    

    【讨论】:

    • 感谢它有效,但 np.random.seed(1) 和 np.random.seed(2) 生成的值具有重复值。 np.random.seed(1) 给出唯一的集合,np.random.seed(2) 也是如此。但合并两个值会产生重复值
    • 是的,尽管@YubrajBhusal 是可以预期的?您正在生成独立的序列,为什么要保证这些没有重复样本? np.random.choice 不知道先前生成的序列,无论随机种子如何
    • 您如何建议我可以创建一组与前一组不同的数字?
    • 你能做的……是生成一个更大的数组,比如df.Quota.sum()*10,然后将它分成10个不同的数组,这将是唯一的@YubrajBhusal
    • 如何按“前缀”列分组并在其中创建随机数,以便每个前缀都有机会获得0到99999之间的随机数。上面的代码创建的随机数总计为“配额”列并为其添加前缀。通过这样做,并非所有前缀都有机会获得从 0 到 99999 的随机数。我想将 np.random.choice 放在前缀上,以便每个其他前缀都有机会获得从 0 到 99999 的随机数。提前致谢跨度>
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多