从np.array中提取的互补指数的不一致。

问题描述 投票:0回答:1

问题很简单,我有一个指数的向量,我想从中随机抽取一个集合及其补集。所以我写了下面的代码。

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。

python numpy indexing numpy-ndarray numpy-random
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.choicereplace=False 是非常低效的,因为他们为了向后兼容而选择了糟糕的实现方式--它只是为了取一个小样本而对整个输入生成一个排列组合。你应该使用新的 生成器API 而不是,它没有这个问题。

rng = np.random.default_rng()

idx = rng.choice(vec, 5000, replace=False)
© www.soinside.com 2019 - 2024. All rights reserved.