2013-09-23 46 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