为什么random.sample不能处理numpy数组,但是random.choices可以处理?

时间:2019-01-06 04:47:50

标签: python arrays numpy random

Python的random模块具有random.choices用于替换抽样和random.sample用于抽样替换。尽管random.choices接受一个numpy数组并返回一个相对于第一个维度随机选择的元素的列表,但是random.sample引发

  

TypeError:填充必须是序列或集合。对于字典,请使用list(d)。

另一方面,random.choices将不接受集合,从而提高

  

TypeError:“设置”对象不支持索引。

我很好奇的是,这是一个疏忽,还是有必要将random.sample限制为序列和集合,而将random.choices限制为支持索引的对象,尽管该函数具有非常大的优势类似的目的。

P.S。如果有人想知道如何对ndarray进行采样,则numpy.random.choice可以对带替换和不带替换的1darray进行采样,并且可以针对具有高级索引的任意维度有效地对高维数组进行采样,其中使用该索引生成该维度的索引numpy.random.choice

1 个答案:

答案 0 :(得分:1)

random.sample尝试check的自变量是collections.abc.Sequence还是collections.abc.Set的实例。这比许多人认为的可靠得多,因为它只检测从那些ABC具体继承或明确注册的类型。 numpy.ndarray不会从这些类继承,也不会注册。

如果不进行检查,或者如果您明确进行collections.abc.Sequence.register(numpy.ndarray),则random.sample可以处理numpy.ndarray

偶然地,numpy.random.choicereplace=False效率低下,仅产生少量样本就产生了entire permutation的输入。由于自然定位会改变使用seed的用户的结果,因此尚未修复此longstanding issue。根据参数,使用random.sample或手动计算样本通常更快。