未选择的numpy random.choice 元素

Posted

技术标签:

【中文标题】未选择的numpy random.choice 元素【英文标题】:numpy random.choice elements that are not selected 【发布时间】:2014-05-17 13:55:00 【问题描述】:

我有一个数组 A 如下:

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

我想从 A 创建 2 个随机子集,如果我将它们组合在一起,我将得到 A

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

所以,S1 是子集之一,现在我如何构造 S2 来包含 A 中不在 S1 中的所有元素;换句话说,S2=A-S1。

【问题讨论】:

【参考方案1】:

设置操作可能会有所帮助:

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

但你可能需要排序:

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

【讨论】:

【参考方案2】:

(次要:如果 A 可以有重复的元素,选择索引的补码和让 S2 包含 A 中不属于 S1 的所有元素是不一样的。)

我可能会完全绕过索引,而是置换元素然后拆分结果:

>>> 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:]

【讨论】:

这个答案被低估了。它提供了一个简单的解决方案。

以上是关于未选择的numpy random.choice 元素的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 numpy.random.choice 实现更快?

在某个预定义的间隔内使用抽屉绘制随机数,`numpy.random.choice()`

对随机矩阵的所有行进行快速随机加权选择

Python 中的 numpy.random.choice()

python:当您使用 random.choice(seq) 从序列中随机选择一个元素时如何知道索引

利用pandas和numpy计算表中每一列的均值