假设我制作了这样的二维数组:
>>> 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 :(得分: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]]
答案 1 :(得分:0)
我无法发表评论,但想提出对unutbu解决方案的改进:
他们的解决方案无法处理此类情况
A=np.arange(25).reshape((5,5))
print(A)
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]
# [20 21 22 23 24]]
print(neighbors(A, 0, 0, n=5))
# [[24 20 21 22 23]
# [ 4 0 1 2 3]
# [ 9 5 6 7 8]
# [14 10 11 12 13]
# [19 15 16 17 18]]
0应该在中间,但相隔一行和一列。
对移位值进行小的修改即可解决
def neighbors_updated(arr, x, y, n_row=3, n_col=3):
''' Given a 2D-array, returns an nxn array whose "center" element is arr[x,y]'''
arr=np.roll(np.roll(arr,shift=-x+int(n_row/2),axis=0),shift=-y+int(n_col/2),axis=1)
return arr[:n_row,:n_col]
print(neighbors(A, 0, 0, n_row=5, n_col=5))
# [[18 19 15 16 17]
# [23 24 20 21 22]
# [ 3 4 0 1 2]
# [ 8 9 5 6 7]
# [13 14 10 11 12]]