从 np.array 中提取的互补指数的不连贯性

Incoherence in complementary indices extracted from a np.array

问题很简单,我有一个索引向量,我想从中提取一组随机选择的集合及其补集。所以我写了下面的代码:

import numpy as np    
vec = np.arange(0,25000)
idx = np.random.choice(vec,5000)
idx_r = np.delete(vec,idx)

然而,当我打印 vec、idx 和 idx_r 的长度时,它们不匹配。 idx 和 idx_r return 值之间的总和高于 len(vec)。例如下面的代码:

print(len(idx))
print(len(idx_r))
print(len(idx_r)+len(idx))
print(len(vec))

returns:

5000 20462 25462 25000

Python版本为3.8.1,GCC为9.2.0。

np.random.choice 有一个关键字参数 replace。它的默认值为 True。如果将值设置为False,我想你会得到想要的结果。

import numpy as np

vec = np.arange(0, 25000)

idx = np.random.choice(vec, 5000, replace=False)

idx_r = np.delete(vec, idx)

print([len(item) for item in (vec, idx, idx_r)])

输出:

[25000, 5000, 20000]

但是,numpy.random.choicereplace=False 效率极低,因为它们为了向后兼容而坚持使用糟糕的实现选择 - 它生成整个输入的排列只是为了取一个小样本。您应该改用新的 Generator API,它没有这个问题:

rng = np.random.default_rng()

idx = rng.choice(vec, 5000, replace=False)