使用Numpy的random.choice从列表中随机删除项目

时间:2016-09-01 11:18:06

标签: python numpy random

根据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}}中抽取一个数字?

2 个答案:

答案 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]

请注意,该方法也会将数组混洗到位,但对于我的目的并不重要。