未选择的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()