numpy random.choice 未被选择的元素

6 投票
3 回答
3464 浏览
提问于 2025-04-18 01:26

我有一个数组A,如下所示:

import numpy as np
A = np.random.sample(100)

我想从A中随机创建两个子集,合在一起能得到A。

inx = np.random.choice(np.arange(100), size=70, replace=False)
S1 = A[inx]

所以,S1是其中一个子集,现在我该如何构建S2,使得S2包含A中所有不在S1里的元素;换句话说,S2=A-S1。

3 个回答

3

(小问题:如果A可以有重复的元素,那么选择索引的补集和让S2包含所有不在S1中的A的元素并不是一回事。)

我可能完全不考虑索引,而是先打乱元素的顺序,然后再分开结果:

>>> A = np.random.sample(10)
>>> S1, S2 = np.split(np.random.permutation(A), [7])
>>> S1
array([ 0.97128145,  0.5617039 ,  0.42625808,  0.39108218,  0.52366291,
        0.73606525,  0.5279909 ])
>>> S2
array([ 0.45652426,  0.38622805,  0.99084781])

不过还有一个方法是使用 np.setdiff1d,所以如果你已经有了 S1

>>> S2 = np.setdiff1d(A, S1)
>>> S2
array([ 0.38622805,  0.45652426,  0.99084781])
3

我觉得这段代码和你想要做的事情是一样的。

A = np.random.sample(100)
T = A[:]
np.random.shuffle(T)

size = 70
S1 = T[:size]
S2 = T[size:]
7

集合操作可能会有帮助:

S2 = A[list(set(range(100)) - set(inx))]

不过你可能需要先排序:

S2 = A[ sorted(list(set(range(100)) - set(inx))) ]

撰写回答