2013-09-23 48 views
7

的指数和值二维数组numpy的说我有构建从一个维数组

Y = np.array([2, 0, 1, 1]) 

从这个我想获得一个矩阵X与形状(len(Y), 3)。在这种特殊情况下,X的第一行应该在第二个索引上有一个,另一个在另一个索引上。 X的第二行应该在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

+0

足够公平:编辑明确提出问题 – cd98

回答

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.]]) 
+0

谢谢!非常可读和快速 – cd98

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'作为例子显示整数。 –

+0

帝斯曼通过一个更好的答案:P –

+1

谢谢!如果任何人有兴趣,我计时@ JoranBeasley和DSM的答案与10000×3阵列和矢量化每个回路744微秒每个循环超过11.8毫秒 – cd98

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) 
+0

我会抛出一个'* 1'或'.astype(int)',但是+1。 – DSM

+0

@DSM如果不进行类型转换,您的代码已经非常快得多了... – Jaime