Чем numpy.choice отличается от numpy.randint?

#python #numpy

#python #numpy

Вопрос:

Мне нужно выполнить выборку с заменой из массива A длиной n . Я хочу знать, чем отличаются две приведенные ниже команды. Если они оба дают одинаковый результат, какой из них лучше (с точки зрения производительности и т. Д.)

 A[np.random.randint(0, n, n)]

A[np.random.choice(n, n)]
  

Комментарии:

1. Вы пробовали синхронизировать их?

2. Обычно выбор кажется более быстрым для n = 1 миллиона, но в некоторых испытаниях выбор занял немного больше времени

3. В моих быстрых тестах времени они были примерно одинаковыми для больших n , а choice для маленьких занимали больше n времени . Вероятно, они оба используют один и тот же генератор случайных чисел, но choice имеют более длительное время настройки — в конце концов, он принимает больше параметров. Но код для обоих компилируется, что сложно изучить.

Ответ №1:

Целью выбора является выборка массива, присвоение ему целого числа — это кратчайший путь к присвоению ему диапазона длины этого целого числа. Таким образом, randint, вероятно, будет более эффективным, если вы злоупотребляете выбором так, как вы есть.

Однако правильный способ сделать это np.random.choice(A, size=n) . Именно так вы пишете «образец с заменой».

Ответ №2:

randint возвращает случайное целое число в указанном диапазоне. choice возвращает случайный элемент из предоставленного массива, или, если вы предоставляете int (как это сделал u), он функционирует как np.random.randint(0, n, n) . Итак, в этом примере нет никакой разницы, однако я полагаю randint , что это будет немного быстрее.

Ответ №3:

Как numpy.randon.randint, так и numpy.random.choice дают вам возможность выбирать случайные числа либо из диапазона (в случае randint), либо из массива (в случае выбора). Если в вашем массиве есть элементы в диапазоне, то основное отличие использования numpy.random.choice заключается в:

  • Укажите, хотите ли вы получить результаты с заменой из массива или без нее.
  • Укажите вероятности, связанные с каждой записью в массиве.

результат подбрасывания одной монеты

  • np.random.randint(2)

результаты десяти тысяч подбрасываний монет

  • np.random.randint(2, size=10000)

результат подбрасывания одной монеты

  • np.random.choice([0, 1])

результат десяти тысяч подбрасываний монет

  • np.random.choice([0, 1], size=10000)

результаты десяти тысяч предвзятых подбрасываний монет

  • np.random.choice([0, 1], size=10000, p=[0.8, 0.2])