numpy中的随机单热矩阵

时间:2017-07-14 02:20:31

标签: python arrays numpy

我想制作一个形状为x的矩阵(n_samples, n_classes),其中每个x[i]是一个随机的单热矢量。这是一个缓慢的实现:

x = np.zeros((n_samples, n_classes))
J = np.random.choice(n_classes, n_samples)
for i, j in enumerate(J):
    x[i, j] = 1

这样做有什么更加pythonic的方法?

2 个答案:

答案 0 :(得分:9)

使用np.eye创建身份矩阵:

x = np.eye(n_classes)

然后使用np.random.choice随机选择行:

x[np.random.choice(x.shape[0], size=n_samples)]

作为简写,只需使用:

np.eye(n_classes)[np.random.choice(n_classes, n_samples)]

演示:

In [90]: np.eye(5)[np.random.choice(5, 100)]
Out[90]: 
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       .... (... to 100)

答案 1 :(得分:1)

对于作业部分,您可以使用advanced indexing

library(qcc)
data(pistonrings)
attach(pistonrings)
diameter <- qcc.groups(diameter, sample)
q <- qcc(diameter[1:25,], type="xbar", nsigmas=3, plot=FALSE)
process.capability(q, spec.limits=c(73.95,74.05))

或其他选项,请使用# initialize data n_samples = 3 n_classes = 5 x = np.zeros((n_samples, n_classes)) J = np.random.choice(n_classes, n_samples) # assign with advanced indexing x[np.arange(n_samples), J] = 1 x #array([[ 0., 1., 0., 0., 0.], # [ 0., 1., 0., 0., 0.], # [ 1., 0., 0., 0., 0.]]) 中的OneHotEncoder

sklearn