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
答案 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.choice
和replace=False
效率低下,仅产生少量样本就产生了entire permutation的输入。由于自然定位会改变使用seed
的用户的结果,因此尚未修复此longstanding issue。根据参数,使用random.sample
或手动计算样本通常更快。