¿Cómo selecciono una ventana de una matriz numpy con condiciones de límite periódicas?

Supongamos que hago una matriz 2d como esta:

>>> A=np.arange(16).reshape((4,4)) >>> A array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) 

y quiero poder seleccionar una ventana de 3×3 alrededor de cualquier elemento dado para que la ventana se ajuste a los límites, ¿cómo lo haría? Sé que puedo hacer esto si los límites de la ventana no se superponen con los límites de la matriz original:

 >>> A[1:4,0:3] array([[ 4, 5, 6], [ 8, 9, 10], [12, 13, 14]]) 

pero si uso una expresión como A[i-1:i+2,j-1:j+2] solo devuelve una matriz vacía para i = 0, j = 0, por ejemplo.

 import numpy as np A=np.arange(16).reshape((4,4)) def neighbors(arr,x,y,n=3): ''' Given a 2D-array, returns an nxn array whose "center" element is arr[x,y]''' arr=np.roll(np.roll(arr,shift=-x+1,axis=0),shift=-y+1,axis=1) return arr[:n,:n] print(A) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11] # [12 13 14 15]] print(neighbors(A,0,0)) # [[15 12 13] # [ 3 0 1] # [ 7 4 5]] print(neighbors(A,1,0)) # [[ 3 0 1] # [ 7 4 5] # [11 8 9]]