2016-09-17 4 views
1

У меня есть матрица M размера mxn и вектор-столбец mx 1. Для каждой из т строк мне нужно получить индекс, соответствующий значению в векторе-столбце минус 1. Таким образом, давая мне ответ mx 1. Как я могу это сделать?Индексирование матрицы по вектору столбца

zb=a1.a3[np.arange(a1.z3.shape[0]),a1.train_labels-1] 

zb.shape 
Out[72]: (4000, 4000) 

a1.z3.shape 
Out[73]: (4000, 26) 

a1.train_labels.shape 
Out[74]: (4000, 1) 

a1.train_labels.head() 
Out[75]: 
     22 
1618 25 
2330 1 
1651 17 
133 17 
2360 5 


#my column vector a1.train_labels is shuffled. I don't want to unshuffle it. 

ответ

1

Если 2d массив M и индексы являются 1d массив v, то вы можете использовать

M[np.arange(len(v)), v - 1] 

Например:

In [14]: M = np.array([[1, 2], [3, 4]]) 

In [15]: v = np.array([2, 1]) 

In [16]: M[np.arange(len(v)), v - 1] 
Out[16]: array([2, 3]) 
+0

Это не работает, как показано в моем примере. Попробуйте перетасовать вектор столбца 'random_perm = np.random.permutation (data_size) train_labels = train_labels.iloc [random_perm]' –

+0

@AbhishekBhatia В моем примере он работает после использования 'np.random.permutation', поэтому я думаю, что проблема в том, где вы превращаете вещи в массивы 'numpy' (оттуда они работают). Могли бы вы либо отправить точное сообщение об ошибке, которое вы получаете, либо какой-то минимальный автономный пример? (предпочтительно оба). –

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