Несколько индексов для массива numpy: IndexError: не удалось привести запись среза типа numpy.ndarray к целому числу

Есть ли способ сделать множественную индексацию в массиве numpy, как описано ниже?

arr=np.array([55, 2, 3, 4, 5, 6, 7, 8, 9])
arr[np.arange(0,2):np.arange(5,7)]

output:
IndexError: too many indices for array

Desired output:
array([55,2,3,4,5],[2,3,4,5,6])

Эта проблема может быть похожа на вычисление скользящего среднего по массиву (но я хочу сделать это без какой-либо предоставленной функции).


person Nickpick    schedule 31.10.2016    source источник
comment
Хотите что-то вроде np.vstack((arr[np.arange(0, 6)], arr[np.arange(1, 7)]))?   -  person mgilson    schedule 31.10.2016
comment
Да, это будет выход, но ярлык не считается, так как в реальном мире arr будет содержать данные, которые нельзя воспроизвести с помощью np.arrange. Я изменил вопрос, чтобы было понятно.   -  person Nickpick    schedule 31.10.2016
comment
Я не уверен, как np.arange(0,2) относится к желаемому результату?   -  person njzk2    schedule 31.10.2016
comment
Это начальный индекс. 0, а затем 1, а конечный индекс равен 5, а затем 6.   -  person Nickpick    schedule 31.10.2016
comment
Итак, диапазон (стоп-старт), который в примере равен 5, будет одинаковым для всех интервалов?   -  person Divakar    schedule 31.10.2016
comment
Да, это было бы идентично, я предполагаю, что это должно быть так, иначе матрица имеет разную длину, что недопустимо.   -  person Nickpick    schedule 31.10.2016
comment
Разве вторая строка не должна быть [ 3, 4, 5, 6, 7] вместо этого?   -  person Divakar    schedule 31.10.2016
comment
@nickpick - я действительно не уверен, что вы пытаетесь сказать здесь ... Мое решение vstack также дает желаемый результат с обновленным arr ...   -  person mgilson    schedule 31.10.2016
comment
Также обратите внимание, что если вам не нужно индексировать с помощью сумасшедших массивов, np.vstack((arr[:6], arr[1:7])) легче набирать, легче понимать и, вероятно, более производительно.   -  person mgilson    schedule 31.10.2016
comment
@mgilson Да, в этом случае решение правильное, но недостаточно общее. Это работает только с небольшим размером матрицы, так как вам нужно вручную складывать их вместе. arr[np.arange(0,5):np.arange(5,10)] уже было бы довольно трудоемко и не работало бы для очень больших массивов.   -  person Nickpick    schedule 31.10.2016
comment
@Divakar Нет, вторая строка имеет начальный индекс 1: np.arange(0,2) Out[41]: array([0, 1])   -  person Nickpick    schedule 31.10.2016
comment
Вам не нужно вручную складывать их вместе... Вам просто нужно сгенерировать массивы, которые вы хотите сложить вместе. Другой, более общий вариант: np.vstack([arr[slice(start, stop)] for start, stop in zip(np.arange(0, 2), np.arange(5, 7))])   -  person mgilson    schedule 31.10.2016
comment
stackoverflow.com/questions/37984214/ обнаружил ту же ошибку при попытке использовать массивы (или списки) в качестве входных данных для среза. В общем, это вопрос о том, как создать несколько диапазонов индексации.   -  person hpaulj    schedule 31.10.2016


Ответы (1)


Вот подход с использованием strides -

start_index = np.arange(0,2)
L = 5     # Interval length
n = arr.strides[0]
strided = np.lib.stride_tricks.as_strided
out = strided(arr[start_index[0]:],shape=(len(start_index),L),strides=(n,n))

Пробный запуск -

In [976]: arr
Out[976]: array([55, 52, 13, 64, 25, 76, 47, 18, 69, 88])

In [977]: start_index
Out[977]: array([2, 3, 4])

In [978]: L = 5

In [979]: out
Out[979]: 
array([[13, 64, 25, 76, 47],
       [64, 25, 76, 47, 18],
       [25, 76, 47, 18, 69]])
person Divakar    schedule 31.10.2016
comment
Можете ли вы уточнить, всегда ли для n = arr.strides[0] вы берете элемент [0] или может быть разница в зависимости от того, в каком измерении идет шаг? - person Nickpick; 02.11.2016
comment
@nickpick Ну, arr.strides дает нам набор шагов по всем димсам. Поскольку мы работаем с одномерным массивом, нам просто нужны шаги по первой оси, поэтому мы получаем первый элемент этого кортежа с [0]. Если это ответ на ваш вопрос? - person Divakar; 02.11.2016
comment
@nickpick См. здесь пример использования двумерных шагов - stackoverflow.com/a/40367540/3293881 - person Divakar; 02.11.2016