首页 文章

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

提问于
浏览
2

我试图用低于某个阈值的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 )替换值低于阈值的所有单元格 .

但是,我想做得更好,并且相邻的细胞相邻 . 这里, "good" neighboring cells 将是那些值为 above the threshold 的相邻单元格 . 我对在低于阈值的小区周围的相邻小区的大小的选择有一点灵活性(相邻小区的大小对于低于阈值的每个小区将是相同的 . )

下图给出了我想要实现的图形概念 . 在下面给出的图片中,每个blob周围的红色边界值低于阈值,表示最近邻居 . 在这些有界框中的每一个中,具有红色刻度标记的单元格是我们在替换其值低于阈值的单元格的值时要考虑的平均值 .
enter image description here

当我们发现值低于阈值的单元格时,我们期望看到 unequal sizes 的blob;以及 near the boundary 的blob .

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

1 回答

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

相关问题