一种常见的解决方案是创建一个随机整数索引数组,这可以通过 numpy 的随机 choice 有效地完成。
使用此设置:
n_dim = 10_000 # size of the original array
n = 100 # size of the random mask
rng = np.random.default_rng(123)
要创建随机索引数组,我们可以使用 numpy 的 choice 传递 数组大小 作为第一个参数:
In [5]: %%timeit
...: m = rng.choice(n_dim, replace=False, size=n)
...:
...:
21.9 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
作为比较,其他答案中提到的布尔数组方法(需要对 0 和 1 的数组进行混洗)相当慢(在本例中慢了 10 倍):
In [7]: %%timeit
...: m = np.hstack([np.ones(n, dtype=bool), np.zeros(n_dim - n, dtype=bool)])
...: rng.shuffle(m)
...:
...:
261 µs ± 604 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
注意:整数索引在稀疏情况下效果最佳,即从原始数组中选择一小部分样本时。在这种情况下,整数索引的 RAM 使用率将远低于布尔掩码。当样本的比例超过原始数组的 10..20% 时,布尔掩码方法会更有效。
NOTE2 整数索引将以随机顺序返回样本。为了在保持顺序的同时对数组进行随机采样,您需要对索引进行排序。布尔掩码自然会返回排序后的样本。
总而言之,如果您正在执行稀疏采样并且您不关心采样项目的顺序,那么此处显示的整数索引可能会优于其他方法。