Генерация уникального случайного значения в Numpy - PullRequest
2 голосов
/ 18 июня 2020

Я пытался сгенерировать большое количество уникальных случайных значений с помощью 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'])

Мне пришлось создать уникальное случайное число и добавить его к префиксу. количество случайных значений указано в 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 Ответ

2 голосов
/ 18 июня 2020

Вы не сможете напрямую использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...