Множество индексов, несмежные диапазоны в numpy

Я хотел бы выбрать несколько несмежных диапазонов из массива 1d numpy (или вектора).

Предположим, что:

>>> idx = np.random.randint(100, size=10)
array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])

Это работает, конечно же:

>>> idx[0:3]
array([82,  9, 11])

И это работает с помощью отдельных показателей:

>>> idx[[0,3,4]]
array([82, 94, 31])

Но что, если я хочу выбрать диапазоны 0:3 и 7: :?

Я пробовал:

>>> idx[[0:3,7:]]
SyntaxError: invalid syntax

Есть ли простой способ сделать это, или мне нужно сгенерировать их отдельно и объединить?

Ответ 1

Вам необходимо конкатенацию до или после индексирования. np.r_ упрощает

In [116]: idx=np.array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])
In [117]: np.r_[0:3,7:10]
Out[117]: array([0, 1, 2, 7, 8, 9])
In [118]: idx[np.r_[0:3,7:10]]
Out[118]: array([82,  9, 11, 77, 49, 50])

np.r_ расширяет срезы и объединяет их.

Вы можете смешивать фрагменты и списки:

In [120]: np.r_[0:3,7:10,[0,3,4]]
Out[120]: array([0, 1, 2, 7, 8, 9, 0, 3, 4])

Конкатенация перед индексированием, вероятно, быстрее, чем после, но для 1-го массива, подобного этому, я не думаю, что разница значительна.