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

DSM приходит с лучшим ответом: 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

Смежные вопросы