【发布时间】:2017-07-04 17:01:14
【问题描述】:
我想遍历我的 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]。第 1 行将导致 -1,这与本示例中的索引 3 相同。 row+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')
但这不起作用。
【问题讨论】:
-
一个技巧是用
row-(row!=0)替换row-1和column类似 -
min(max(0, row-1), MAX_INDEX) -
@TadhgMcDonald-Jensen 你不需要在右侧切断;当切片太大的上限时会优雅地处理。
-
感谢 Paul,它的工作原理完全符合我的预期!
标签: python arrays numpy 2d slice