2016-04-13 4 views
1

Это может быть очень простой вопрос, если вы знаете, как это сделать, но я просто не могу понять синтаксис:Python косвенная индексация

У меня есть массив 5x10 нулей: y1 = np.zeros((5,10)) и 5x1 массив из индекс: index=np.array([2,3,2,5,6]). Для каждой строки y1 я хотел бы установить 1 в столбце, указанном индексом. Результат будет выглядеть так:

array([[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.]]) 

Любой может помочь вам :-)?

ответ

0

Вы можете сделать многомерную индексацию массива с помощью array[index_1, index_2]. Для вашей проблемы:

y1[range(y1.shape[0]), index] = 1 

диапазона (y1.shape [0]) генерирует массив [0,1,...,n-1], где n является количеством строк в y1. Этот массив является вашим индексом строки, а index - индексом столбца.

+0

Да, это работает! Большое спасибо! – Chea

0

Просто используйте Перечислим()

import numpy as np 

y1 = np.zeros((5,10)) 
index=np.array([2,3,2,5,6]) 


for i,item in enumerate(y1): 
    item[index[i]] = 1 

print(y1) 
# [[ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.] 
# [ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] 
# [ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.] 
# [ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.] 
# [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]] 

ли это делать то, что вы хотите?

+0

Извините, что я не хочу использовать цикл for, потому что он будет очень медленным. Я ищу векторизованное решение – Chea

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