我在这里需要一些帮助,遗憾的是,我自己找不到解决办法。 我有一个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 解决方案。
提前致谢!
答案 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]])