Добавить смещение к индексам массива Numpy

Следуя этому вопросу (и ответу Хорхеки): to-image">Быстрый способ разрезать изображение на перекрывающиеся участки и объединить их с изображением Я хочу добавить смещение к индексам исправленного массива, т.е.:

A = np.arange(W*H).reshape(H,W)
P = patchify(A,(X,Y)) 

Предполагая, что X,Y являются нечетными числами, размер P будет равен W-X+1,H-Y+1, следовательно, пиксель с центром в P[0,0] будет фактически соответствовать A[(Y-1) /2,(Х-1)/2].

Есть ли способ сместить (без копирования каких-либо данных) индексы P, чтобы иметь идеальное соответствие?

Для справки, вот существующая функция patchify:

def patchify(img, patch_shape):
    img = np.ascontiguousarray(img)  # won't make a copy if not needed
    X, Y = img.shape
    x, y = patch_shape
    shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape
    # The right strides can be thought by:
    # 1) Thinking of `img` as a chunk of memory in C order
    # 2) Asking how many items through that chunk of memory are needed when indices
    #    i,j,k,l are incremented by one
    strides = img.itemsize*np.array([Y, 1, Y, 1])
    return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)

person memecs    schedule 17.12.2013    source источник
comment
Например, скажем, W, H, X, Y = (10, 14, 4, 7), P.shape будет (11, 4, 4, 7), как вы не хотите компенсировать и что?   -  person alko    schedule 17.12.2013
comment
Только что исправлено, размер X, Y должен быть нечетным. Рассмотрим W,H,X,Y = (10,14,5,7), P.shape будет (6,8,5,7), я хочу получить доступ к P[0,0] как P[2, 3]   -  person memecs    schedule 17.12.2013
comment
тогда P.shape равен (10, 4, 5, 7), следовательно, P[0,0].shape равен (5, 7), это левый верхний подмассив A размером 5x7. Все еще непонятно, что вы хотите   -  person alko    schedule 17.12.2013
comment
Я не понимаю, почему вы говорите, что P.shape равен (10,4,5,7)? P.shape должен быть (6,8,5,7). Я хочу иметь возможность изменить макет памяти или что-то еще, что позволило бы мне ввести P [2,3] и получить то, что сейчас P [0,0], то есть подмассив 5.7 с центром в A [2,3]   -  person memecs    schedule 17.12.2013
comment
Вы смешиваете W и H, если хотите 6,8. И каким будет значение P[0,0] в этом случае?   -  person alko    schedule 17.12.2013
comment
Это не имеет значения, это может быть ошибка, выходящая за рамки, или перенос, как в случае с P[-1,-1]   -  person memecs    schedule 17.12.2013


Ответы (1)


Следующее выражение

P = np.roll(np.roll(P, X/2, 0), Y/2, 1)

что вам нужно?

Демо:

>>> W, H, X, Y =  10, 14, 5, 7
>>> A = np.arange(W*H).reshape(W,H)
>>> P = patchify(A,(X,Y))
>>> P = np.roll(np.roll(P, X/2, 0), Y/2, 1)
>>> all(map(all, P[X/2, Y/2] == A[:X, :Y]))
True    
person alko    schedule 17.12.2013