我想制作一个形状为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的方法?
答案 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