根据numpy's random.Generator.choice函数的文档,其中一个参数是shuffle,默认为True.

文件规定:

shuffle布尔,可选

不更换的抽样时是否对样本进行洗牌.默认为True,False提供加速.

没有足够的信息让我弄清楚这意味着什么. 我不明白如果它已经是适当随机的,为什么我们还要进行洗牌,我也不明白如果这会产生有偏见的样本,为什么我会 Select 不进行洗牌.

如果我将shuffle设置为False,我仍然可以获得随机(独立)样本吗? 我也想知道为什么我想要默认设置True.

推荐答案

无论您 Select 了shuffle个,您仍然会得到随机 Select .但是,如果 Select shuffle=False,则输出的顺序与输入的顺序无关.

当 Select 的项目数等于项目总数时,这最容易看出:

import numpy as np
rng = np.random.default_rng()
x = np.arange(10)
rng.choice(x, 10, replace=False, shuffle=False)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
rng.choice(x, 10, replace=False, shuffle=True)
# array([8, 1, 3, 9, 6, 5, 0, 7, 4, 2])

如果您减少 Select 的物品数量并使用shuffle=False,则可以确认缺失的物品是否按预期分发.

import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
x = np.arange(10)
set_x = set(x)
missing = []
for i in range(10000):
    # By default, all `p` are equal, so which item is
    # missing should be uniformly distributed
    y = rng.choice(x, 9, replace=False, shuffle=False)
    set_y = set(y)
    missing.append(set_x.difference(set_y).pop())
plt.hist(missing)

enter image description here

但您会看到x中较早出现的项往往会在输出中较早出现,反之亦然.也就是说,输入和输出顺序是相关的.

x = np.arange(10)
correlations = []
for i in range(10000):
    y = rng.choice(x, 9, replace=False, shuffle=False)
    correlations.append(stats.spearmanr(np.arange(9), y).statistic)
plt.hist(correlations)

enter image description here

如果这对您的应用程序来说可以,请随时设置shuffle=False以加速.

%timeit rng.choice(10000, 5000, replace=False, shuffle=True)
# 187 µs ± 26.9 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit rng.choice(10000, 5000, replace=False, shuffle=False)
# 146 µs ± 18.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

要 Select 的项目越多,加速就越明显.

%timeit rng.choice(10000, 1, replace=False, shuffle=True)
# 17.6 µs ± 3.64 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit rng.choice(10000, 1, replace=False, shuffle=False)
# 16.5 µs ± 2.47 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

vs

%timeit rng.choice(10000, 9999, replace=False, shuffle=True)
# 214 µs ± 32.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit rng.choice(10000, 9999, replace=False, shuffle=False)
# 124 µs ± 27.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Python相关问答推荐

两极按组颠倒顺序

将两个收件箱相连导致索引的列标题消失

如何推迟对没有公钥的视图/表的反射?

重命名变量并使用载体中的字符串存储 Select 该变量

将C struct 的指针传递给Python中的ioctel

如何终止带有队列的Python进程?+ 队列大小的错误?

ambda将时间戳与组内另一列的所有时间戳进行比较

Pandas 除以一列中出现的每个值

jit JAX函数中的迭代器

在内部列表上滚动窗口

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

当多个值具有相同模式时返回空

Python库:可选地支持numpy类型,而不依赖于numpy

大小为M的第N位_计数(或人口计数)的公式

Python键入协议默认值

删除字符串中第一次出现单词后的所有内容

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

使用特定值作为引用替换数据框行上的值

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

Flask Jinja2如果语句总是计算为false&