2013-09-23 13 views
7

Say mamConstruct dwuwymiarowej tablicy numpy z indeksów i wartości w jednej tablicy wymiarowej

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

Od tego chcę otrzymać macierz X w kształcie (len(Y), 3). W tym konkretnym przypadku pierwszy wiersz X powinien mieć jeden na drugim indeksie, a zero na inne. Drugi wiersz X powinien mieć jeden na indeksie 0, a zero w przeciwnym razie. Wyraźnie:

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

Jak mogę wyprodukować tę matrycę? Zacząłem

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

ale potem nie mógł dowiedzieć się, jak wypełnić/wypełnić te z listy indeksów

jak zawsze, dzięki za poświęcony czas!

+1

Na czym polega pytanie? – milancurcic

+0

Wystarczająco fair: edytowane, aby jawnie zadać pytanie: – cd98

Odpowiedz

13

Może:

>>> 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

Dzięki! Bardzo czytelny i szybki zbyt. – 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 

myślę ... nie sądzę że istnieje prostszy sposób (ale może się mylę)

+1

'np.zeros ((len (Y), 3))'. Również może chcieć określić 'dtype = np.int' jako przykład pokazuje liczby całkowite. –

+0

DSM przychodzi z lepszą odpowiedzią: P –

+1

Dzięki! W przypadku, gdy ktoś jest zainteresowany, wyliczyłem odpowiedź @ JoranBeasley'a i DSM z tablicą 10000 na 3, a wektoryzacja daje 744 μs na pętlę ponad 11,8 ms na pętlę – cd98

3

Aby dać alternatywę jedno-liner do DSM doskonale dobra odpowiedź:

>>> 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

Wrzuciłbym '* 1' lub' .astype (int) ', ale +1. – DSM

+0

@DSM Twój kod jest już znacznie szybszy niż ten bez konwersji typu ... – Jaime

Powiązane problemy