Итерация по idx
и сбор фрагментов - неплохой вариант, если число «строк» не слишком велико (а размер размеров относительно велик).
In [55]: x = np.array([[1,2,3,4,5,6],[10,20,30,40,50,60]])
In [56]: idx = [1,3]
In [57]: np.array([x[j,i:i+2] for j,i in enumerate(idx)])
Out[57]:
array([[ 2, 3],
[40, 50]])
Соединение ломтиков, как это работает, только если они все одного размера.
Альтернативой является сбор индексов в массив и выполнение одной индексации.
Например, с похожей итерацией:
idxs = np.array([np.arange(i,i+2) for i in idx])
Но вещание может быть лучше:
In [58]: idxs = np.array(idx)[:,None]+np.arange(2)
In [59]: idxs
Out[59]:
array([[1, 2],
[3, 4]])
In [60]: x[np.arange(2)[:,None], idxs]
Out[60]:
array([[ 2, 3],
[40, 50]])
ravel_multi_index
не сложно скопировать (если вам не нужно вырезать и т. Д.):
In [65]: np.ravel_multi_index((np.arange(2)[:,None],idxs),x.shape)
Out[65]:
array([[ 1, 2],
[ 9, 10]])
In [66]: x.flat[_]
Out[66]:
array([[ 2, 3],
[40, 50]])
In [67]: np.arange(2)[:,None]*x.shape[1]+idxs
Out[67]:
array([[ 1, 2],
[ 9, 10]])