首页 > 解决方案 > 通过取相邻元素的平均值来替换 numpy 矩阵中的元素

问题描述

我正在尝试用相关单元格附近的矩阵单元格的平均值(即值低于阈值的矩阵单元格的平均值)替换某个阈值以下的 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]

下面是上述矩阵的图片。在此处输入图像描述

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

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

下图给出了我想要实现的目标。在下面给出的图片中,每个斑点周围的红色边界值低于阈值,代表最近的邻居。在每个有界框内,带有红色勾号的单元格是我们在替换值低于阈值的单元格的值时要考虑其平均值的单元格。在此处输入图像描述

当我们发现值低于阈值的单元格时,我们期望看到大小不等的 blob ;还有边界附近的斑点。

在 Python 中,实现这一预期目标的最佳方法是什么?我将非常感谢任何答案。

标签: pythonnumpymatrix

解决方案


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

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]])

推荐阅读