用numpy / scipy计算矩阵中每个单元格的邻域乘积

时间:2014-11-15 12:25:16

标签: python numpy

我正在尝试实现一种图像处理算法,该算法涉及为每个单元计算4邻域的乘积。也就是说,为y[i, j] = x[i-1, j] * x[i, j-1] * x[i+1, j] * x[i, j+1]计算X的新矩阵Y.应该忽略越界邻居。

现在我只能想到这种方法:使用scipy.ndimage.filters.correlate并使用0和1传递权重以获得四个矩阵,每个矩阵包含一个方向上每个单元格的邻居,如传入{{1}我得到weight = [[0, 0, 0], [1, 0, 0], [1, 1]],而其他权重我可以a[i, j] = x[i-1, j]b[i, j] = x[i, j-1]c[i, j] = x[i+1, j]。然后我使用d[i, j] = x[i, j+1]来计算这四个矩阵的乘积。

然而,这种方法有点太慢,我不能忽视边界。还有另一种方法可以用numpy / scipy做到这一点所以我不必诉诸于循环吗?

2 个答案:

答案 0 :(得分:3)

你需要分别写出边缘,但这样做你所追求的数组的中心部分,并且可能明显快于相关性:

y = np.empty_like(x)
y[1:-1, 1:-1] = x[1:-1, 1:-1]
y[1:-1, 1:-1] *= x[:-2, 1:-1]
y[1:-1, 1:-1] *= x[2:, 1:-1]
y[1:-1, 1:-1] *= x[1:-1, :-2]
y[1:-1, 1:-1] *= x[1:-1, 2:]

答案 1 :(得分:3)

我认为这更符合您的要求:

import numpy as np

x = np.array([
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 1],
    [2, 3, 4, 5, 6],
    [7, 8, 9, 1, 2]
])

y = np.ones_like(x)
y[+1:, :] *= x[:-1, :]
y[:-1, :] *= x[+1:, :]
y[:, +1:] *= x[:, :-1]
y[:, :-1] *= x[:, +1:]

y
#>>> array([[  12,   21,   64,  135,    4],
#>>>        [  14,  288,  756,  160,  270],
#>>>        [ 126,  448, 1080,  216,   10],
#>>>        [  16,  189,   32,   90,    6]])

请注意,如果您需要额外的速度,第一个*=可以是作业。