Подвижной windows подход с использованием as_strided
:
In [1]: a = np.arange(6)
In [2]: a
Out[2]: array([0, 1, 2, 3, 4, 5])
In [3]: as_strided = np.lib.stride_tricks.as_strided
Для этой односменной работы параметр strides
прост. shape
требует большего размышления - сколько строк мы ожидаем, и максимальный индекс:
In [5]: b = as_strided(a, shape=(3,4), strides=(8,8))
In [6]: b
Out[6]:
array([[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5]])
Затем выберите столбцы:
In [8]: b[:,[0,2,3]]
Out[8]:
array([[0, 2, 3],
[1, 3, 4],
[2, 4, 5]])
Чтобы расширить его до трехмерного случая, я Вы будете работать с { ссылка }, ответ LudvigH
In [10]: a = np.arange(2*2*10).reshape((2,2,10)) # some example input
...: b = np.array([0,2,3])
In [11]: a
Out[11]:
array([[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]])
In [12]: a.shape
Out[12]: (2, 2, 10)
In [13]: a.strides
Out[13]: (160, 80, 8)
In [18]: a1 = as_strided(a, shape=(2,2,3,4), strides=(160,80,8,8))
In [19]: a1
Out[19]:
array([[[[ 0, 1, 2, 3],
[ 1, 2, 3, 4],
[ 2, 3, 4, 5]],
[[10, 11, 12, 13],
[11, 12, 13, 14],
[12, 13, 14, 15]]],
[[[20, 21, 22, 23],
[21, 22, 23, 24],
[22, 23, 24, 25]],
[[30, 31, 32, 33],
[31, 32, 33, 34],
[32, 33, 34, 35]]]])
Это всего лишь продолжение первого случая, когда первые два измерения просто идут вместе для поездки. Это последние измерения, которые развернулись в 2-мерное окно.
Снова выбираем подмножество столбцов:
In [20]: a1[:,:,:,b]
Out[20]:
array([[[[ 0, 2, 3],
[ 1, 3, 4],
[ 2, 4, 5]],
[[10, 12, 13],
[11, 13, 14],
[12, 14, 15]]],
[[[20, 22, 23],
[21, 23, 24],
[22, 24, 25]],
[[30, 32, 33],
[31, 33, 34],
[32, 34, 35]]]])
Шаг as_strided
эффективен, создавая view
. Но индексация сделает копию. Нам нужно было бы потратить некоторое время, чтобы проверить это с помощью подхода LudvigH со смещенным индексом.