从一维数组的索引和值构建二维numpy数组

7
说我有
Y = np.array([2, 0, 1, 1])

我想获得一个形状为(len(Y), 3)的矩阵X。在这种特殊情况下,X的第一行应该在第二个索引处为1,其他情况下为0。X的第二行应该在第0个索引处为1,其他情况下为0。具体来说:

X = np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0], [0, 1, 0]])

我要如何产生这个矩阵? 我是从以下开始的:
X = np.zeros((Y.shape[0], 3))

但是我无法弄清如何将列表中的索引填充/填入其中。

一如既往,感谢您的时间!


1
什么是问题? - milancurcic
好的:编辑一下,明确提出问题。 - cd98
3个回答

13

也许:

>>> Y = np.array([2, 0, 1, 1])
>>> X = np.zeros((len(Y), 3))
>>> X[np.arange(len(Y)), Y] = 1
>>> X
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  1.,  0.]])

3
为了给DSM先生完美的答案提供一个简短的替代方案:
>>> Y = np.array([2, 0, 1, 1])
>>> np.arange(3) == Y[:, np.newaxis]
array([[False, False,  True],
       [ True, False, False],
       [False,  True, False],
       [False,  True, False]], dtype=bool)

我会加入一个*1.astype(int),但是+1。 - DSM
@DSM,您的代码已经比这个快得多了,而且没有类型转换... - Jaime

1
Y = np.array([2, 0, 1, 1])
new_array = np.zeros((len(Y),3))
for i in range(len(Y)):
    new_array[i,Y[i]] = 1

我认为...我不认为有更简单的方法(但我可能是错的)


1
np.zeros((len(Y), 3), dtype=np.int) - Steven Rumbalski
DSM 给出了更好的答案 :P - Joran Beasley
1
谢谢!如果有人感兴趣的话,我用一个10000乘3的数组测试了@JoranBeasley和DSM的答案,并且向量化每个循环需要744微秒,每个循环需要11.8毫秒。 - cd98

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接