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

Python 使用Numpy的random.choice从列表中随机删除项,python,numpy,random,Python,Numpy,Random,根据,使用replace=False和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仍然在5的范围内,并且没有像我期望的那样丢失一个

根据,使用replace=False和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仍然在5的范围内,并且没有像我期望的那样丢失一个随机数。如何在不替换的情况下从范围5中抽取一个数字

我最终使用随机库定义了一个函数:

其用途如下所示:

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]

请注意,该方法也会在适当的位置对数组进行洗牌,但出于我的目的,这并不重要。

如其中一条注释所述,np.choice从序列中选择带替换或不带替换的一系列数字。但它不会修改序列

简单的选择

我认为你想要的行为是:

arr = range(5)
all_but_one = np.random.choice(arr, len(arr) -1, replace=False)
因此,您可以选择N-1个数字而不进行替换,以避免重复,从而有效地从iterable中删除随机元素

更有效的替代方案


np.random.choice不会改变原始数组。它不是从数组中直接采样。你没有将它分配回arr.@Divakar,这将是OP所寻找的补充。我如何从range5中采样一个数字而不替换?对于单个数字,有无部件并不重要。如果要对两个数字进行采样,只需执行np.random.choicearr,2,替换即可=False@juanpa.arrivillaga我不确定OP在寻找什么,但因为OP提到:array arr仍然是range5,所以我之前的评论是这样的。
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)
arr = range(5)
random_index = np.random.randint(0, len(arr))
arr.pop(random_index)