问题很简单,我有一个指数的向量,我想从中随机抽取一个集合及其补集。所以我写了下面的代码。
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之间的和返回的值大于len(vec)。例如,下面的代码。
print(len(idx))
print(len(idx_r))
print(len(idx_r)+len(idx))
print(len(vec))
返回:
5000204622546225000
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
是非常低效的,因为他们为了向后兼容而选择了糟糕的实现方式--它只是为了取一个小样本而对整个输入生成一个排列组合。你应该使用新的 生成器API 而不是,它没有这个问题。
rng = np.random.default_rng()
idx = rng.choice(vec, 5000, replace=False)