2012-12-13 97 views
1

可能重複:
Numpy/Python: Array iteration without for-loop最好在相鄰細胞基質比較方式

假設我有大小100×100的矩陣,我想每個像素比較其直接鄰居(左,上,右,下),然後對當前矩陣或相同大小的新矩陣進行一些操作。 在Python/numpy的一個示例代碼可能看起來像以下: (比較> 0.5是沒有意義的,我只是想給一個工作例如對於一些操作,同時比較鄰居)

import numpy as np 
my_matrix = np.random.rand(100,100) 
new_matrix = np.array((100,100)) 
my_range = np.arange(1,99) 
for i in my_range: 
    for j in my_range: 

     if my_matrix[i,j+1] > 0.5: 
      new_matrix[i,j+1] = 1 

     if my_matrix[i,j-1] > 0.5: 
      new_matrix[i,j-1] = 1 

     if my_matrix[i+1,j] > 0.5: 
      new_matrix[i+1,j] = 1 

     if my_matrix[i-1,j] > 0.5: 
      new_matrix[i-1,j] = 1 

     if my_matrix[i+1,j+1] > 0.5: 
      new_matrix[i+1,j+1] = 1 

     if my_matrix[i+1,j-1] > 0.5: 
      new_matrix[i+1,j-1] = 1 

     if my_matrix[i-1,j+1] > 0.5: 
      new_matrix[i-1,j+1] = 1 

這可以得到真的很討厭,如果我想步入一個鄰近的小區,並從它開始比較它的鄰居......你有什麼建議如何以更有效的方式做到這一點?這甚至有可能嗎?

+0

http://stackoverflow.com/questions/13805286/numpy-python-array-iteration-without-for-loop/13805310 – YXD

+0

也許你應該澄清你想要的東西......只是想着,它看起來像你想要知道具有值1的哪個像素被8個像素包圍,全部具有1。是這樣嗎? – deinonychusaur

回答

2

我不是100%肯定,你的目標是什麼與你的代碼,這在邊界忽略索引問題等同於

new_matrix = my_matrix > 0.5 

,但你可以用形態學操作快速完成這些計算的高級版本:

import numpy as np 
from scipy.ndimage import morphology 

a = np.random.rand(5,5) 
b = a > 0.5 

element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]) 
result = morphology.binary_dilation(b, element) * 1 
+0

謝謝,我會研究形態學操作(以前從未聽說過)。正如我在更新的帖子中寫道> 0.5應該只對某些操作的例子... – HyperCube

+0

維基百科的文章和這個網站:http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm是一個開始的好地方。頁面底部的「練習1」顯示了我的示例中的結構元素。 – YXD

+0

我想我知道了,但是,它並沒有幫助我解決第二個問題。如果鄰居滿足特定的條件,我想從該鄰居重新與過程開始...這意味着這個特定鄰居的鄰居應檢查... – HyperCube

0

,以防止這種「越來越討厭」的方法是:封裝鄰居檢查代碼的功能。然後,您可以在必要時使用鄰居的座標進行調用。

如果您需要跟蹤哪些對您檢查,這樣你就不會保持同樣的,使用某種記憶化的最重要的是。

+0

什麼用downvote的? OP特別關注連鎖支票。如果有人不認爲這個答案是相關的,我想知道爲什麼。 (關於如何捆綁支票已經有了一個很好的答案,OP正是因爲這個原因而發現不足)。 – alexis

+0

我也認爲你的解決方案是合適的。我想將不得不寫兩個解決方案的組合,使其更好地工作.. – HyperCube