Передача случайного семени в функцию numpy random.choice

Допустим, у меня есть функция, которая принимает аргумент random_state для обеспечения воспроизводимости.

def replicable_function(random_seed):
    choice = np.random.choice(X, 10)
    #do more stuff here with choice
    return f(choice)

Это два моих требования:

  1. Передача одного и того же random_seed (может быть целым числом или объектом np.random.RandomState) означает, что replicable_function всегда выводит одно и то же
  2. Я не меняю глобальное случайное начальное состояние numpy (пытаясь быть милым с пользователем и не менять то, чего он не ожидает)

В идеале я хотел бы передать этот random_state функции np.random.choice, но, похоже, она не принимает такой аргумент (см. исходный код здесь!)


person cd98    schedule 16.11.2019    source источник


Ответы (1)


Я понял этот ответ сразу после того, как спросил его здесь. Я не уверен, что это лучшее решение, поэтому я рад получить другие предложения.

В итоге я использовал служебную функцию из sklearn, которая при необходимости превращает целочисленный ввод в экземпляр RandomState.

def check_random_state(seed):
    """Turn seed into a np.random.RandomState instance

    Parameters
    ----------
    seed : None | int | instance of RandomState
        If seed is None, return the RandomState singleton used by np.random.
        If seed is an int, return a new RandomState instance seeded with seed.
        If seed is already a RandomState instance, return it.
        Otherwise raise ValueError.
    """
    if seed is None or seed is np.random:
        return np.random.mtrand._rand
    if isinstance(seed, (numbers.Integral, np.integer)):
        return np.random.RandomState(seed)
    if isinstance(seed, np.random.RandomState):
        return seed
    raise ValueError('%r cannot be used to seed a numpy.random.RandomState'
                     ' instance' % seed)

Таким образом, я мог бы написать:

from sklearn.utils import check_random_state

def replicable_function(random_seed):
    random_seed = check_random_state(random_seed)
    choice = random_seed.choice(X, 10) #instead of np.random.choice(X, 10)
    #do more stuff here with choice
    return f(choice)
person cd98    schedule 16.11.2019