2017-02-15 62 views
3

我想遍历我的2D numpy数组并检查它的所有直接邻居。 如果我做一个numpy的阵列,像这样:如何切割2D 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我明白为什么本是th电子情况。例如,如果我取8的值,它的索引为[2,0]。第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') 

但这并没有工作。

+1

一个特技将取代'行1'与''行向和类似地对于'column' –

+1

'分钟(MAX(0,行-1),MAX_INDEX)' –

+2

@ TadhgMcDonald-Jensen你不需要在右侧切断;当分割太大的上限时会优雅地处理。 –

回答

0

您可以简化循环的编写方式,而不是假设数组内容的多少,从而使您的代码更加灵活。 Numpy有一个nditer类,可用于迭代数组。您也可以使用它来获取每个元素的multi-dimensional index。使用ndenumerate类可以进一步简化迭代,类似于Pythons内置函数enumerate。如果您不需要获取元素,只需索引,则可以使用ndindex。下面是使用ndindex一个例子:(!行= 0)

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) 
+0

这很有用。我回到这个线程是因为我想知道如何搜索特定索引周围的更大区域。我做了它的工作,但代码是可怕的。这也适用于这样做。 下面是我用来搜索长度为3的所有方向的代码。 for i,j in np.ndindex(a。形状): check = a [max(i-3,0):min(i + 4,height),max(j-3,0):min(j + 4,width)] print(i,j ) 打印(支票) – Tea

+0

@Tea。您应该选择可帮助您解决问题的答案。这是本网站的标准操作程序。您可以随时更改您的选择。 –