numpy.random.choice

numpy.random.choice(a, size=None, replace=True, p=None)

Случайная выборка из значений заданного одномерного массива.

Параметры:
a - целое положительное число, одномерный массив или одномерная последовательность
Если указан массив или последовательность, то выборка генерируется из его элементов. Если указано число, то выборка генерируется из массива аналогичного np.arange(a).
size - целое положительное число или кортеж целых положительных чисел, необязательный параметр
Если данный параметр не указан, то будет возвращено одно целое случайное число. Если указано одно число d, то будет возвращен одномерный массив с количеством элементов равным d. Если указано несколько чисел, то количество этих чисел будет определять количество осей массива, а их значения - количество элементов вдоль каждой из них.
replace - True или False, необязательный параметр
Данный параметр определяет уникальность элементов в выборке. По умолчанию replace=True, т.е. элементы в выборке могут повторяться.
p - одномерный массив или одномерная последовательность, необязательный параметр
Каждый элемент массива p определяет вероятность соответствующего элемнта из a оказаться в выборке. Входной массив a и p должны быть одинаковой длинны, а сумма элементов массива p должна быть равна 1. По умолчанию p = None, что соответствует равномерному распределению вероятности.
Возвращает:
результат - один элемент или массив NumPy
Массив, указанной формы, все элементы которого взяты случайным образом из входного массива a. Если вместо массива указано число (т.е. a - это число), то элементы выборки берутся из np.arange(a). Если параметр size не указан, то будет возвращен один элемент.

Замечание

Доступно в NumPy c версии 1.7.0.

Смотрите так же:
random.rand()


Примеры

Создание выборки из np.arange(10) длинной в 4 элемента. Так как параметр p не указан, то появление каждого элемента в выборке равновероятно:

>>> import numpy as np
>>> np.random.choice(10, 4)    #  эквивалентно np.random.randint(0, 10, 4)
array([1, 9, 0, 5])
>>>
>>> np.random.choice(10)    #  эквивалентно np.random.randint(0, 10)
9

В параметре p можно задать вероятность появления каждого элемента в выборке:

>>> perm = [0, 0, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0, 0]
>>> 
>>> np.random.choice(10, 4, p = perm)
array([5, 4, 3, 7], dtype=int32)

Параметр replace позволяет указать какими должны быть элементы выборки, False - все уникальные, True - элементы могут повторяться.

>>> np.random.choice(10, 7, replace = True)    #  True по умолчанию
array([4, 8, 9, 0, 8, 8, 7])
>>> 
>>> np.random.choice(10, 7, replace = False)
array([0, 7, 9, 3, 8, 1, 5])

Если replace = False, то необходимо учитывать, что размер выборки не должен превышать размеры исходного массива:

>>> np.random.choice(10, 11)
array([7, 3, 3, ..., 5, 0, 0])
>>> 
>>> np.random.choice(10, 11, replace = False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mtrand.pyx", line 1166, in mtrand.RandomState.choice
ValueError: Cannot take a larger sample than population when 'replace=False'

Так же следует учитывать, что "уникальность" элементов входного массива определяется не их значением, а индексом. Поэтому, если в исходном массиве присутствуют одинаковые элементы, то использование replace = False может приводить к неверным результатам:

>>> a = [1, 1, 1, 2, 2, 2]
>>> np.random.choice(a, 4, replace = False)
array([2, 1, 1, 2])

Вы можете получать выборки с ункальными элементами даже на основе заданного распределения вероятностей:

>>> np.random.choice(10, 8, p = perm)
array([3, 3, 2, 8, 8, 1, 6, 1], dtype=int32)
>>> 
>>> np.random.choice(10, 8, replace = False, p = perm)
array([8, 4, 3, 7, 2, 6, 1, 5])

Но, количество ненулевых записей в p не должно быть меньше количества элементов входного массива a:

>>> perm = [0, 0, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0, 0]
>>> 
>>> np.random.choice(10, 8, p = perm)
array([5, 7, 2, 2, 4, 5, 3, 4], dtype=int32)
>>> 
>>> np.random.choice(10, 8, replace = False, p = perm)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mtrand.pyx", line 1171, in mtrand.RandomState.choice
ValueError: Fewer non-zero entries in p than size

Получение случайных выборок основано на операциях с индексами, поэтому все приведенные выше операции могут применяться к нечисловым массивам:

>>> a = ['spam', 'foo', 'bar']
>>> np.random.choice(a, 2)
array(['spam', 'spam'], dtype='<U4')