用相邻元素的平均值替换numpy矩阵中的元素

5
我将尝试替换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中,实现此目标的最佳方法是什么?非常感谢任何答案。

你的矩阵被倒置了。 - Reblochon Masque
1
你是在说这些数据图表,Reblochon吗?我使用了pcolor生成这些图表。我会尝试寻找方法使它们更好看。 - Commoner
是的,与打印的行相比,图中的行是倒置的。 - Reblochon Masque
2
这是一个好点子,Reblochon。因为使用了 pcolor() 函数,所以图片被反转了。另一种选择(也许你想看到的)是使用 imshow() 函数,它会与打印的数组元素相对应。pcolor() 函数将原点 (0,0) 放置在如同图形中通常做的那样;这就是我喜欢它的原因。 - Commoner
2
也许可以使用 numpy.ma.convolve?即在卷积之前屏蔽无效值。这是一个未记录的函数,但自 NumPy 1.12 以来一直存在:https://github.com/numpy/numpy/pull/7922/files - John Zwinck
1个回答

5

这可能可行,但您可能更喜欢保留原始矩阵并对副本进行更精确的更改:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接