2010-11-10 13 views
12

Supposons que je fais un tableau 2D comme ceci:Comment sélectionner une fenêtre à partir d'un tableau avec des conditions aux limites périodiques?

>>> 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]]) 

et je veux être en mesure de sélectionner une fenêtre 3x3 autour de tout élément donné pour que la fenêtre s'enroule autour des limites comment pourrais-je faire? Je sais que je peux le faire si les limites de la fenêtre ne se chevauchent pas les limites du tableau d'origine:

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

mais si j'utilise une expression comme A[i-1:i+2,j-1:j+2] retourne seulement un tableau vide pour i = 0, j = 0 par exemple.

Répondre

15
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]]