#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])