假设我有一个大小为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
如果我想进入一个相邻的单元格并从它开始将其与邻居进行比较,这可能会变得非常讨厌......您是否有一些建议如何以更有效的方式完成此操作?这甚至可能吗?
答案 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)
保持这种“变得讨厌”的方法是:在函数中封装邻居检查代码。然后你可以在必要的时候用邻居的坐标来调用它。
如果您需要跟踪已检查的对,以便不保留相同的对,请在此基础上使用某种记忆。