根据http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html,使用带有Numpy的random.choice
方法的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}}中抽取一个数字?
答案 0 :(得分:6)
如其中一条评论中所述,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)
答案 1 :(得分: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]
请注意,该方法也会将数组混洗到位,但对于我的目的并不重要。