Вот метод, использующий stride_tricks
. Работает для произвольного числа измерений.
from numpy.lib.stride_tricks import as_strided
def pp(dims,strides):
dims,strides = np.asarray(dims),np.asarray(strides)
aux = np.arange(1,(dims-1).sum()+2)
return as_strided(aux[(dims-1)@(strides==-1):],dims,aux.strides*strides)
Примеры:
>>> pp((2,3),(-1,0))
array([[2, 2, 2],
[1, 1, 1]])
>>> pp((2,3,4),(-1,-1,-1))
array([[[7, 6, 5, 4],
[6, 5, 4, 3],
[5, 4, 3, 2]],
[[6, 5, 4, 3],
[5, 4, 3, 2],
[4, 3, 2, 1]]])
Обратите внимание, что для оси y принято начинать сверху вниз и опускаться вниз. Если вы хотите иначе, вам придется перевернуть его.
Также обратите внимание, что созданные массивы являются несмежными представлениями, если вы хотите изменить их, лучше сделайте копию.