In [297]: a = np.arange(24).reshape(4,6)
In [298]: a
Out[298]:
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]])
Если мы изменим размер 4 от dim до (2,2), а от 6 до (2,3):
In [299]: a.reshape(2,2,2,3)
Out[299]:
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]]]])
Порядок блоков неправильный, но мы можно исправить это с помощью транспонирования:
In [300]: a.reshape(2,2,2,3).transpose(0,2,1,3)
Out[300]:
array([[[[ 0, 1, 2],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 9, 10, 11]]],
[[[12, 13, 14],
[18, 19, 20]],
[[15, 16, 17],
[21, 22, 23]]]])
и получить максимум каждого из 2-х внутренних блоков:
In [301]: a.reshape(2,2,2,3).transpose(0,2,1,3).max((2,3))
Out[301]:
array([[ 8, 11],
[20, 23]])
a.reshape(2,2,2,3).max((1,3))
получает тот же максимум.
Хорошо, это не было сделано с strides
, но это дает мне представление о том, как использовать шаги.
шагов самого a
:
In [303]: a.strides
Out[303]: (48, 8)
после изменения формы:
In [304]: a.reshape(2,2,2,3).strides
Out[304]: (96, 48, 24, 8)
и после транспонирования:
In [305]: a.reshape(2,2,2,3).transpose(0,2,1,3).strides
Out[305]: (96, 24, 48, 8)
Так что мы можем использовать эти шаги напрямую:
In [313]: np.lib.stride_tricks.as_strided(a,(2,2,2,3),(96,24,48,8))
Out[313]:
array([[[[ 0, 1, 2],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 9, 10, 11]]],
[[[12, 13, 14],
[18, 19, 20]],
[[15, 16, 17],
[21, 22, 23]]]])