gpt4 book ai didi

python - 如何切片 2D numpy 数组以获得它的直接邻居?

转载 作者:行者123 更新时间:2023-11-28 19:09:26 24 4
gpt4 key购买 nike

我想遍历我的 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 相同。 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')

但这没有用。

最佳答案

您可以简化循环的编写方式,而不是过多地假设数组的内容,从而使您的代码更加灵活。 Numpy 有一个 nditer可用于迭代数组的类。您还可以使用它来获取 multi-dimensional index每个元素。使用 ndenumerate 可以进一步简化迭代类,类似于 Pythons 内置 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)

关于python - 如何切片 2D numpy 数组以获得它的直接邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42259464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com