2015-01-21 3 views
0

У меня есть 2D массив целых чисел (например, A с A.shape (10,5)) и 1D массив индексов столбцов (которые обычно отличаются друг от друга) (например, idx с idx.shape (10,)). Из i-й строки я хотел бы получить элемент из массива A с индексом столбца idx [i]. Что было бы лучшим (самым быстрым) решением, если желаемый результат - 1D-массив приобретенных элементов или список этих элементов?Доступ к элементам массива по массиву/списку индексов столбцов

A = np.arange(50).reshape(10,5) 
idx=np.array([2,4,0,0,3,1,3,1,2,4]) 

Желаемое выход:

output = [2,9,10,15,23,26,33,36,42,49] 

или

output = np.array([2,9,10,15,23,26,33,36,42,49]) 
+0

можете ли вы написать какой-либо код, который у вас есть с вашей структурой? – Bestasttung

ответ

5

numpy Использование вы можете взять диагонали индекс столбца, например:

np.diag(A[:,idx]) 
# array([ 2, 9, 10, 15, 23, 26, 33, 36, 42, 49]) 
2

Вы можете использовать enumerate для доступа к номеру строки вы на, а затем использовать его для доступа к индексу вам нужно на idx например:

output = [] 

for row in enumerate(A): 
    output.append(row[1][idx[row[0]]]) 

Из этого я получил output == [2, 9, 10, 15, 23, 26, 33, 36, 42, 49]

2
A[np.arange(A.shape[0]), idx] 

np.diag(A[:,idx]) работает, но делает больше работы, чем это необходимо. A[:,idx] является (10,10) array (in this example), which is then whittled down to a (10,) `.

Для этого небольшого массива мое усилие 2x быстрее. Для (100,50) он в 16 раз быстрее.

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