0

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

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))

返回:

5000 20462 25462 25000

Python 版本是 3.8.1,GCC 是 9.2.0。

4

1 回答 1

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)
于 2020-05-02T21:04:28.300 回答