2016-09-01 5 views
-1

В соответствии с http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html использование replace = False с помощью метода Numpy random.choice должно производить выборку без замены. Однако, это не похоже на работу для меня:Использование случайного выбора Numpy для случайного удаления элемента из списка

In [33]: import numpy as np 

In [34]: arr = range(5) 

In [35]: number = np.random.choice(arr, replace = False) 

In [36]: arr 
Out[36]: [0, 1, 2, 3, 4] 

Массив arr еще range(5) после взятия пробы, и не хватает (случайное) число, как я бы ожидать. Как я мог пробовать номер от range(5) без замены?

+1

'np.random.choice' не мутировать исходный массив. Это не буквально выборка из массива. –

+2

Вы не назначаете его обратно в 'arr'. – Divakar

+0

@ Divakar, который будет дополнять то, что ищет OP. –

ответ

4

Как упоминалось в одном из комментариев, np.choice выбирает с заменой или без нее последовательность чисел из последовательности. Но он не изменяет последовательность.

Легкая альтернатива

arr = range(5) 
# numbers below will never contain repeated numbers (replace=False) 
numbers = np.random.choice(arr, 3, replace=False) 

Поведение Я думаю, что вы хотите, будет:

arr = range(5) 
all_but_one = np.random.choice(arr, len(arr) -1, replace=False) 

так что вы бы выбрали N-1 чисел без замены (чтобы избежать повторений), эффективно удаляя случайный элемент из итерируемого.

Более эффективная альтернатива

arr = range(5) 
random_index = np.random.randint(0, len(arr)) 
arr.pop(random_index) 
0

Я в конечном итоге определить функцию с помощью random библиотеки:

import random 
def sample_without_replacement(arr): 
    random.shuffle(arr) 
    return arr.pop() 

Его применение показано ниже:

In [51]: arr = range(5) 

In [52]: number = sample_without_replacement(arr) 

In [53]: number 
Out[53]: 4 

In [54]: arr 
Out[54]: [2, 0, 1, 3] 

Обратите внимание, что метод также перемешивает массив на месте, но для моих целей это не имеет значения.

Смежные вопросы