从 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.choice
和 replace=False
效率极低,因为它们为了向后兼容而坚持使用糟糕的实现选择 - 它生成整个输入的排列只是为了取一个小样本。您应该改用新的 Generator API,它没有这个问题:
rng = np.random.default_rng()
idx = rng.choice(vec, 5000, replace=False)
问题很简单,我有一个索引向量,我想从中提取一组随机选择的集合及其补集。所以我写了下面的代码:
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.choice
和 replace=False
效率极低,因为它们为了向后兼容而坚持使用糟糕的实现选择 - 它生成整个输入的排列只是为了取一个小样本。您应该改用新的 Generator API,它没有这个问题:
rng = np.random.default_rng()
idx = rng.choice(vec, 5000, replace=False)