比较矩阵中相邻单元的更好方法

时间:2012-12-13 10:24:23

标签: python matlab matrix numpy scipy

  

可能重复:
  Numpy/Python: Array iteration without for-loop

假设我有一个大小为100x100的矩阵,我想将每个像素与其直接邻居(左,上,右,下)进行比较,然后对当前矩阵或相同大小的新矩阵进行一些操作。 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

如果我想进入一个相邻的单元格并从它开始将其与邻居进行比较,这可能会变得非常讨厌......您是否有一些建议如何以更有效的方式完成此操作?这甚至可能吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

保持这种“变得讨厌”的方法是:在函数中封装邻居检查代码。然后你可以在必要的时候用邻居的坐标来调用它。

如果您需要跟踪已检查的对,以便不保留相同的对,请在此基础上使用某种记忆。