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

发布于 2021-01-29 18:08:24

假设我制作一个二维数组,如下所示:

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

并且我希望能够围绕任何给定的元素选择一个3x3的窗口,以便该窗口围绕边界包裹,我该怎么做?我知道如果窗口的边界不与原始数组的边界重叠,我可以这样做:

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

但是,如果我使用类似的表达式,A[i-1:i+2,j-1:j+2]则仅对于i = 0,例如j = 0,返回一个空数组。

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    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]]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看