Construya una matriz numpy bidimensional a partir de índices y valores de una matriz unidimensional

Di que tengo

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

De esto quiero obtener una matriz X con forma (len(Y), 3) . En este caso particular, la primera fila de X debe tener un uno en el segundo índice y cero en otro. La segunda fila de X debería tener uno en el índice 0 y cero en caso contrario. Para ser explícito:

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

¿Cómo produzco esta matriz? Comencé con

 X = np.zeros((Y.shape[0], 3)) 

pero luego no pudo averiguar cómo rellenar / completar los de la lista de índices

Como siempre, gracias por tu tiempo!

Tal vez:

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

Para dar una alternativa de una sola línea a la respuesta perfectamente buena de 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) 
 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 

Creo que … no creo que haya una manera más fácil (pero podría estar equivocado)