我有一个numpy布尔二维数组,表示一个灰度图像,它基本上是一个未填充的形状(三角形,正方形,圆形),包括True
表示白色像素,False
表示黑色像素。我想通过将白色像素修改为黑色像素来添加黑色填充。
array([[True, True, True, False, False, False, False, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, False, False, False, False, True, True, True]])
(此数组中间正方形中的9 True
值应为False
。)
是否有一个简单/快速的numpy切片方法?我可以随时修改所有True
的内容False
后跟True
,直到False
的下一个实例?
答案 0 :(得分:1)
这里有一个易于实施并且应该能够快速执行的想法。
我会使用0和1,所以看起来更清晰。
这是起始数组:
>>> a
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]])
使用np.logical_and.accumulate
从左向右累积,从左向右翻转,再次执行相同操作,向后翻转,以及将“或”两个数组放在一起:
>>> andacc = np.logical_and.accumulate
>>> (andacc(a, axis=1) | andacc(a[:, ::-1], axis=1)[:, ::-1]).astype(int)
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]])
(省略.astype(int)
以保留布尔数组而不是0和1。)
这是一个三角形:
>>> b
array([[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1],
[1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1],
[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]])
>>> (andacc(b, axis=1) | andacc(b[:, ::-1], axis=1)[:, ::-1]).astype(int)
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
答案 1 :(得分:0)
根据您的逻辑,您可以使用False替换第一个False和最后一个False之间的所有值:
CacheTags