如何从具有周期性边界条件的numpy数组中选择窗口?

2da*_*aaa 14 python numpy

假设我像这样制作一个2d数组:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

我希望能够在任何给定元素周围选择一个3x3窗口,以便窗口环绕边界我将如何做到这一点?我知道如果窗口的边界不与原始数组的边界重叠,我可以这样做:

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

但是如果我使用像A[i-1:i+2,j-1:j+2]它这样的表达式,只返回i = 0的空数组,例如j = 0.

unu*_*tbu 16

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]]
Run Code Online (Sandbox Code Playgroud)