获取某一点附近的索引列表-有更有效的方法吗



我正在尝试使用二维数字网格,我经常需要收集该网格中点(x,y(周围的索引列表。网格本身就是一个np_array,我不太擅长numpy来使用它的高级函数,所以我更倾向于"Pascal";方式如下:

neighbors=[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
result=[]
for i in neighbors:
if (x+i[0]>=0) and (x+i[0]<dims[0]) and (y+i[1]>=0) and (y+i[1]<dims[1]):
result.append([x+i[0],y+i[1]])
return result

这里的dims是该网格的形状。我想知道是否有一种更方便、更快的方法已经在Numpy中实现了。最终,我想创建一个";视图";作为不包括目标的目标的8邻域的原始阵列的值的变化将反映在原始阵列上。我知道这是可能的,因为a.T已经是a的视图,所以功能是存在的。但是如何制作呢?我甚至不在乎它是否会是1-D。

如果你想要一个3x3(或更小(的盒子,你可以计算出限制并切片:

top = max(x - 1, 0)
left = max(y - 1, 0)
bottom = min(x + 1, arr.shape[0])
right = min(y +1, arr.shape[1])
result = arr[top:bottom, left:right]

如果你只想要索引,你可以创建slice对象,top:bottomleft:right会变成:

result = (slice(top, bottom), slice(left, right))

您可以直接使用这个元组:

arr[result]

如果要查看原始数据而不是副本,则必须使用切片。为了使数据具有一致的步幅(因此可以表示为切片(,除了它的邻居之外,它还必须包括感兴趣的点。

最新更新