在列和行范围内的Numpy数组操作

时间:2016-09-27 19:36:25

标签: python arrays performance numpy

我有一个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的下一个实例?

2 个答案:

答案 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