Numpy否定了像python那样的索引

时间:2017-05-10 11:29:38

标签: python numpy indexing

我在这里需要一些帮助,遗憾的是,我自己找不到解决办法。 我有一个numpy中的数组(图像),我在其中索引中心部分并可以创建一个图像,其中正确的中心部分设置为黑色,如下所示:

11111
10001
10001
10001
11111

可以通过img[1:3, 1:3] = 0之类的东西来实现。 现在我也想要这样的补充:

00000
01110
01110
01110
00000

numpy中有img[~1:3,~1:3] = 0之类的东西吗?

我试图找到相关的问题,但想不出更多的搜索词,似乎没有人有同样的问题。也许解决方案太容易了?我希望有一个非hacky 解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以使用行和列掩码,然后在两个掩码之间使用广播OR-ing -

def assign_not_block(a, row_start, row_stop, col_start, col_stop, value=0):
    m,n = a.shape   
    row_mask = np.ones(m,dtype=bool)
    col_mask = np.ones(n,dtype=bool)
    row_mask[row_start: row_stop] = 0
    col_mask[col_start: col_stop] = 0
    a[row_mask[:,None] | col_mask] = value
    return a

示例运行 -

In [244]: a
Out[244]: 
array([[5, 4, 5, 3, 5, 6, 7],
       [0, 8, 7, 8, 7, 8, 2],
       [4, 2, 6, 4, 2, 5, 2],
       [2, 7, 1, 8, 2, 6, 5],
       [5, 6, 6, 7, 0, 2, 1]])

In [245]: assign_not_block(a, row_start=1, row_stop=4, col_start=1, col_stop = 5)
Out[245]: 
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 8, 7, 8, 7, 0, 0],
       [0, 2, 6, 4, 2, 0, 0],
       [0, 7, 1, 8, 2, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]])

答案 1 :(得分:3)

不,基本切片不允许“除指定之外的所有索引”。在NumPy中,您通常使用masks (also called "boolean array indexing")来解决此问题。例如:

>>> mask = np.zeros((5, 5), dtype=bool)
>>> mask[1:4, 1:4] = True
>>> mask
array([[False, False, False, False, False],
       [False,  True,  True,  True, False],
       [False,  True,  True,  True, False],
       [False,  True,  True,  True, False],
       [False, False, False, False, False]], dtype=bool)

然后使用遮罩进行切片:

>>> img = np.ones((5, 5), dtype=int)
>>> img[mask] = 0
>>> img
array([[1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1],
       [1, 0, 0, 0, 1],
       [1, 0, 0, 0, 1],
       [1, 1, 1, 1, 1]])

但是这次掩码可以用~

反转
>>> img = np.ones((5, 5), dtype=int)
>>> img[~mask] = 0
>>> img
array([[0, 0, 0, 0, 0],
       [0, 1, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0]])