如何切割2D numpy阵列以获得其直接邻居?
我想遍历我的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')
但这并没有工作。
您可以简化循环的编写方式,而不是假设数组内容的多少,从而使您的代码更加灵活。 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)
这很有用。我回到这个线程是因为我想知道如何搜索特定索引周围的更大区域。我做了它的工作,但代码是可怕的。这也适用于这样做。 下面是我用来搜索长度为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
@Tea。您应该选择可帮助您解决问题的答案。这是本网站的标准操作程序。您可以随时更改您的选择。 –
一个特技将取代'行1'与''行向和类似地对于'column' –
'分钟(MAX(0,行-1),MAX_INDEX)' –
@ TadhgMcDonald-Jensen你不需要在右侧切断;当分割太大的上限时会优雅地处理。 –