numpy.random.choice против random.choice

Почему numpy.random.choice не работает так же, как random.choice? Когда я делаю это:

 >>> random.choice([(1,2),(4,3)])
 (1, 2)

Оно работает.

Но когда я делаю это:

 >>> np.random.choice([(1,2), (3,4)])
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "mtrand.pyx", line 1393, in mtrand.RandomState.choice 
 (numpy/random/mtrand/mtrand.c:15450)
 ValueError: a must be 1-dimensional

Как мне добиться того же поведения, что и random.choice() в numpy.random.choice()?

2 ответа

Решение

Что ж np.random.choice как отмечено в документации, ожидается, что одномерный массив и ваш ввод, выраженный в виде массива, будет 2D, Так что просто так не получится.

Чтобы заставить его работать, мы можем ввести длину входного значения и позволить ему выбрать один индекс, который при индексации во входном сигнале будет эквивалентен random.choice, как показано ниже -

out = a[np.random.choice(len(a))] # a is input

Пробный прогон -

In [74]: a = [(1,2),(4,3),(6,9)]

In [75]: a[np.random.choice(len(a))]
Out[75]: (6, 9)

In [76]: a[np.random.choice(len(a))]
Out[76]: (1, 2)

В качестве альтернативы, мы можем преобразовать входные данные в одномерный массив объекта dtype, что позволило бы нам напрямую использовать np.random.choice, как показано ниже -

In [131]: a0 = np.empty(len(a),dtype=object)

In [132]: a0[:] = a

In [133]: a0.shape
Out[133]: (3,)  # 1D array

In [134]: np.random.choice(a0)
Out[134]: (6, 9)

In [135]: np.random.choice(a0)
Out[135]: (4, 3)

Кроме того, если вы хотите, чтобы случайные выборки строк 2D-матрицы, как это

x = np.array([[1, 100], [2, 200], [3, 300], [4, 400]])

тогда вы можете сделать что-то вроде этого:

n_rows = x.shape[0]
x[np.random.choice(n_rows, size=n_rows, replace=True), :]

Должен работать для двумерной матрицы с любым количеством столбцов, и вы, конечно, можете делать выборки сколько угодно раз с size Кварг и др.

Другие вопросы по тегам