2012-12-13 40 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