【问题标题】:How to slice a 2D numpy array to get its direct neighbors?如何切片 2D numpy 数组以获取其直接邻居?
【发布时间】: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-1column 类似
  • min(max(0, row-1), MAX_INDEX)
  • @TadhgMcDonald-Jensen 你不需要在右侧切断;当切片太大的上限时会优雅地处理。
  • 感谢 Paul,它的工作原理完全符合我的预期!

标签: python arrays numpy 2d slice


【解决方案1】:

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

【讨论】:

  • 这很有用。我回到这个线程是因为我想知道如何在特定索引周围搜索更大的区域。我让它工作,但代码是可怕的。这也非常适合这样做。这是我用来在所有方向搜索长度为 3 的代码。 for i, j in np.ndindex(a.shape): check = a[max(i-3, 0):min(i+4, height ), max(j-3, 0):min(j+4, width)] print(i, j) print(check)
  • @Tea。您应该选择可以帮助您解决问题的答案。这是本网站的标准操作程序。您可以随时更改您的选择。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多