【问题标题】:How to generate and apply a square mask in numpy如何在 numpy 中生成和应用方形蒙版
【发布时间】:2016-10-18 00:38:52
【问题描述】:

我真的无法理解 Numpy 中掩码的工作原理。

我创建了一个类似的面具

import numpy
def make_mask(center_x,center_y,len_x,len_y):
      x,y = numpy.ogrid[:len_x, :len_y]
      mask = (center_x-x)**2 + (center_y-y)**2
      return mask

然后我尝试使用它

 >>>a = numpy.ones((10,10))
 >>>mask = make_mask(2,2,2,2,2)
 >>>a[mask] = 0
 >>>a
 array([[1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0]])

我期待的是这样的

 >>>a
 array([[1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,0,0,1,1,1,1],
        [1,1,0,0,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1]])

我尝试了几个不同版本的函数。我只是无法获得所需的行为。我究竟做错了什么。我真的不明白 2D 矩阵如何索引 2D 矩阵。

【问题讨论】:

  • 你能发布你所有的代码吗?目前,您的 make_mask 函数未定义 center_xcenter_y 并且无法按提供的方式工作。除非你的意思是 center_xcenter_yindex_xindex_y。无论哪种方式,它都无法按照您提供的方式工作。
  • 另外,make_mask 调用中还有第五个参数。
  • 但是,我认为您正在寻找的是切片符号:stackoverflow.com/questions/509211/…。我会检查这个链接,我相信这会有所帮助。
  • 编辑了代码。这就是我的全部代码。这是我在 RPEL 中准备的东西。很抱歉错过了命名变量。这是一个诚实的错误。我也理解切片符号。问题是我不明白 2D 矩阵如何索引 2D 矩阵。您必须了解在感觉像魔术的事情上寻求帮助真的很困难。举个例子:stackoverflow.com/questions/8647024/…同样的问题二维数组索引二维数组是什么?

标签: python python-2.7 numpy


【解决方案1】:

如果你看看你的 make_mask 函数做了什么,写成这样:

def make_mask(index_x,index_y,len_x,len_y):
      x,y = numpy.ogrid[:len_x, :len_y]
      mask = (index_x-x)**2 + (index_y-y)**2
      return mask

你会看到你得到了

array([[8, 5],
       [5, 2]])

当您使用该 2x2 矩阵索引 10x10 矩阵时,我相信它将该矩阵中的所有值视为按行索引较大的矩阵。这就是为什么您会看到第 2 行全为零、第 5 行全为零和第 8 行全为零的原因。

要获得你想要的效果,你可以使用你拥有的索引,你甚至不需要一个函数:

a[startx:startx+lenx, starty:starty+leny] = 0

给出:

array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])

【讨论】:

    【解决方案2】:

    您的掩码将第 2、第 5 和第 8 行设置为 0;阵列被展平,因为它的形状与其掩蔽的阵列不同。它被应用为:

    a[2] = 0
    a[5] = 0
    a[8] = 0
    

    我想你期待的更像是:

    mask = numpy.ones_like(a)
    mask[center_y:center_y + len_y, center_x:center_x + len_x] = 0
    

    与您要屏蔽的数组具有相同的大小并给出预期的结果。

    【讨论】:

    • 谢谢。我想我毕竟还是不懂python数组切片。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多