2016-10-06 4 views
0

рассмотрим массивы a и bкак я нарежьте массив Numpy, используя массив 1d позиций

a = np.arange(25).reshape(5, -1) 
b = np.array([4, 2, 3, 0, 1]) 

Как нарезать a с помощью b, чтобы получить эти элементы?

enter image description here


я могу использовать список понимание

np.array([a[i, b[i]] for i in range(5)]) 

array([ 4, 7, 13, 15, 21]) 

Но я хотел чистого раствора Numpy

+0

@ Divakar спасибо, что указал. У меня было время найти правильные условия поиска. – piRSquared

+0

Да, я тоже хотел бы, чтобы у меня был прямой дубль, но это своего рода прикованный к 1D и 2D вариантам. – Divakar

ответ

1

Попробуйте это:

>>> a[np.arange(5), b] 
array([ 4, 7, 13, 15, 21]) 

Когда индексы ARRA ys, они интерпретируются по-разному, следуя broadcasting rules.

+0

Производительность, есть ли разница между 'a [range (5), b]' и 'a [np.arange (5), b]'? –

+0

Хорошая точка: использование '' np.arange'' будет быстрее, потому что он создает массив индексов более напрямую. Я отредактирую ответ (хотя '' range() '' действительно работает) – jakevdp

+0

Jup, думал так: «arange» смежна в памяти и может быть повторена с помощью нескольких скоростей. «Диапазон» либо несмежен в памяти (Python 2), либо объект, который «на лету» генерирует значения (Python 3). Оба, скорее всего, медленнее. –