簡體   English   中英

如何切割2D numpy數組以獲得其直接鄰居?

[英]How to slice a 2D numpy array to get its direct neighbors?

我想遍歷我的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相同。 行+ 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類,可用於迭代數組。 您還可以使用它來獲取每個元素的多維索引 使用ndenumerate類可以進一步簡化迭代,類似於Pythons builtin 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM