通过取相邻元素的平均值来替换numpy矩阵中的元素

时间:2018-07-22 07:02:36

标签: python numpy matrix

我正在尝试将numpy矩阵中低于某个阈值的值替换为所关注单元附近的矩阵单元的平均值(即那些低于阈值的矩阵单元的值)。

作为一个例子,让我们考虑这个10 * 10的矩阵(例如matrx):

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

print matrx
[[ 1  4  9  2  2  5  1  1  9  1]
 [ 2  4  3  5  2  2  1  2  1  1]
 [ 3  4 -2 -3  4  2  3  5  1  2]
 [ 2  3 -3 -5  3  3  7  8 -4  1]
 [ 3  4  2  3  4  2  3  7  3  2]
 [ 1  4  9  3  4  3  3  2  9  4]
 [ 2  1  3  5  2  2  3  2  3  3]
 [ 3  6  8  3  7  2  3  5  3  2]
 [ 5 -2 -3  5  2  3  7  8  4  3]
 [ 4 -2 -3  1  1  2  3  7  3  5]]

并且,我们假设阈值为零。目前,我正在使用以下方法找到值低于零的单元格的(2d)位置:

threshold = 0
mark_x = np.where( matrx<0 )[0]
mark_y = np.where( matrx<0 )[1]

下面是上述矩阵的图片。 enter image description here

在我的工作中,值低于阈值的单元格大多以块的形式出现(正如人们在矩阵中所看到的)。目前,我将所有值低于阈值的单元格替换为矩阵(matrx)的平均值。

但是,我想做得更好,并且将低于阈值的元素的值替换为与相关单元格相邻的良好相邻元素的平均值。在这里,“好”的相邻单元格将是值高于阈值的那些相邻单元格。在选择低于阈值的单元周围的相邻单元的大小时,我有点灵活(对于低于阈值的每个单元,相邻单元的大小将相同)。

下面的图片给出了我想要实现的图形化构想。在下面给出的图片中,每个斑点周围的红色边界(其值低于阈值)表示最近的邻居。在每个有界框内,带有红色刻度的单元格是我们希望在替换低于阈值的单元格值时要考虑的平均值的单元格。 enter image description here

当我们发现值低于阈值的像元时,我们会期望看到大小不等的斑点;以及边界附近的斑点。

在Python中,实现此目标的最佳方法是什么?我将非常感谢您的回答。

1 个答案:

答案 0 :(得分:1)

这可能有效,但是,您可能更喜欢保留原始矩阵并更改副本以使其更加精确:

for x, y in zip(mark_x, mark_y) :
    slice = matrx[max(0, x-2):x+2, max(0,y-2):y+2] # assuming you want 5x5 square
    matrx[x,y] = np.mean([i for i in slice.flatten() if i > 0])  # threshold is 0

给出结果:

array([[1, 4, 9, 2, 2, 5, 1, 1, 9, 1],
       [2, 4, 3, 5, 2, 2, 1, 2, 1, 1],
       [3, 4, 3, 3, 4, 2, 3, 5, 1, 2],
       [2, 3, 3, 3, 3, 3, 7, 8, 3, 1],
       [3, 4, 2, 3, 4, 2, 3, 7, 3, 2],
       [1, 4, 9, 3, 4, 3, 3, 2, 9, 4],
       [2, 1, 3, 5, 2, 2, 3, 2, 3, 3],
       [3, 6, 8, 3, 7, 2, 3, 5, 3, 2],
       [5, 4, 3, 5, 2, 3, 7, 8, 4, 3],
       [4, 4, 4, 1, 1, 2, 3, 7, 3, 5]])