Is following expression
P = np.roll(np.roll(P, X/2, 0), Y/2, 1)
what you need?
Demo:
>>> 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