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')