В чем разница между функциями random.choices () и random.sample ()? - PullRequest
0 голосов
/ 16 января 2020

У меня есть следующий список: list = [1,1,2,2].

После применения метода sample (rd.sample(list, 3)) вывод: [1, 1, 2].

После применения choices метод (rd.choices(list, 3)), вывод: [2, 1, 2].

В чем разница между этими двумя методами? Когда один должен быть предпочтительнее другого?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Принципиальное отличие состоит в том, что random.choices() будет (в конечном итоге) рисовать элементы в одной и той же позиции (всегда выборка из всей последовательности, поэтому после рисования элементы заменяются - с заменой ), в то время как random.sample() не будет (после отбора элементов они удаляются из популяции в выборку, поэтому после извлечения элементы не заменяются - без замены ).

Обратите внимание, что здесь заменено следует понимать как , помещенное назад , а не как синоним замещенное .

Чтобы лучше понять это, давайте рассмотрим следующий пример:

import random


random.seed(0)


ll = list(range(10))

print(random.sample(ll, 10))
# [6, 9, 0, 2, 4, 3, 5, 1, 8, 7]

print(random.choices(ll, k=10))
# [5, 9, 5, 2, 7, 6, 2, 9, 9, 8]

Как видите, random.sample() не создает повторяющихся элементов, в то время как random.choices() делает.

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

Eventua только вы не можете sample() больше, чем размер входной последовательности, в то время как это не проблема с choices():

# print(random.sample(ll, 20))
# ValueError: Sample larger than population or is negative


print(random.choices(ll, k=20))
# [9, 3, 7, 8, 6, 4, 1, 4, 6, 9, 9, 4, 8, 2, 8, 5, 0, 7, 3, 8]

Более общее c и теоретическое обсуждение процесса выборки может можно найти в Википедии .

1 голос
/ 16 января 2020

Основное c отличие заключается в следующем:

  • Используйте функцию random.sample, если вы хотите выбрать несколько случайных элементов из списка, не включая дубликаты.
  • Используйте функцию random.choices, если вы хотите выбрать из списка несколько элементов, включая повторяющиеся.

Вот два примера, демонстрирующих разницу:

import random

alpha_list=['Batman', 'Flash', 'Wonder Woman','Cyborg', 'Superman']

choices=random.choices(alpha_list,k=7)
print(choices)

sample= random.sample(alpha_list,k=3)
print(sample)

Output: ['Cyborg', 'Cyborg', 'Wonder Woman', 'Flash', 'Wonder Woman', 'Flash', 'Batman']
['Superman', 'Flash', 'Batman']

Как видно из приведенных выше примеров, в random.choices () вы можете передать 'k', чтобы быть больше длины вашей последовательности, так как random.choices () допускает дубликаты .

Принимая во внимание, что если вы передадите значение 'k' больше длины последовательности в random.sample (), вы получите ошибку:

Образец больше, чем популяция или отрицательный.

Теперь перейдем к случаям использования:

  • random.choices(sequence, weights=None, cum_weights=None, k=1): вы хотели бы использовать это , когда можете себе позволить иметь дубликаты в вашей выборке . Именно по этой причине мы можем дать значение k> len(dataset).
  • random.sample(sequence, k): вы хотели бы использовать это , когда вы не можете позволить себе иметь дубликаты во время выборки ваши данные .

Для дальнейшего чтения:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...