我想遍历我的2D numpy数组并检查它的所有直接邻居。 如果我像这样制作一个numpy数组:
tilemap = np.arange(16).reshape(4,4)
看起来像这样:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
我创建的循环帮助我找到数组中每个点的邻居,如下所示:
import numpy as np
mapwidth = 4
mapheight = 4
tilemap = np.arange(mapwidth * mapheight).reshape(mapwidth, mapheight)
row = 0
for i in tilemap:
count = 0
for j in i:
column = j % mapwidth
check = tilemap[row-1:row+2, column-1:column+2]
print(check)
count += 1
if count % mapheight == 0:
row += 1
但是,当我这样做时,我不会在数组中找到任何邻居,其值为0,1,2,3,4,8和12.我明白为什么会这样。例如,如果我取值8.它的索引为[2,0]。 row-1将导致-1,这与此示例中的索引3相同。行+ 2是2.并且切片2:3将不会产生任何结果,因为2和3之间没有任何内容。
无论如何,我正在寻找的结果是这样的(对于值8):
[[4 5]
[ 8 9]
[12 13]]
我知道我可以通过堆积一些if语句来达到这个目的,但我想知道是否有一种更优雅的方法可以解决这个问题。
感谢您的时间。
(对于那些很想知道这一点的人): 例如,邻居值11实际上就像我想要的那样返回,没有任何错误。它返回:
[[6 7]
[10 11]
[14 15]]
编辑:
我还应该提到我试过这个:
check = np.take(tilemap, tilemap[row-1:row+2, column-1:column+2], mode = 'clip')
但这不起作用。
答案 0 :(得分:0)
您可以简化循环的编写方式,而不是假设数组的内容太多,使代码更灵活。 Numpy有一个nditer
类,可用于迭代数组。您还可以使用它来获取每个元素的multi-dimensional index。使用ndenumerate
类可以进一步简化迭代,类似于Pythons builtin enumerate
。如果您不需要返回元素,只需要索引,则可以使用ndindex
。以下是使用ndindex
:
for r, c in ndindex(tilemap.shape):
check = tilemap[max(r-1, 0):min(r+1, mapheight), max(c-1, 0):min(c+1, mapwidth)]
print(check)