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

Python 列和行范围内的Numpy数组操作,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,我有一个numpy布尔2D数组,它表示一个灰度图像,它本质上是一个未填充的形状(三角形、正方形、圆形),由白色像素的True和黑色像素的False组成。我想通过将白色像素修改为黑色像素来添加黑色填充 array([[True, True, True, False, False, False, False, False, True, True, True], [True, True, True, False, True, True, True, False, True, Tru

我有一个numpy布尔2D数组,它表示一个灰度图像,它本质上是一个未填充的形状(三角形、正方形、圆形),由白色像素的
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 <代码>真/ <代码>值在这个数组中间的正方形应该变成<代码> false


是否有一种简单/快速的numpy切片方法?我可以修改所有
True
的内容,只要出现
False
后接
True
,直到下一个
False

根据您的逻辑,您可以用False替换第一个False和最后一个False之间的所有值:

def mutate(A):
    ind = np.where(~A)[0]
    if len(ind) != 0:
        A[ind.min():ind.max()] = False
    return A


np.apply_along_axis(mutate, 1, arr)

# array([[ True,  True,  True, False, False, False, False, False,  True,
#          True,  True],
#        [ True,  True,  True, False, False, False, False, False,  True,
#          True,  True],
#        [ True,  True,  True, False, False, False, False, False,  True,
#          True,  True],
#        [ True,  True,  True, False, False, False, False, False,  True,
#          True,  True],
#        [ True,  True,  True, False, False, False, False, False,  True,
#          True,  True]], dtype=bool)

这里有一个想法很容易实现,而且应该很快执行

我将使用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_和.acculate从左到右累加,从左到右翻转,再次执行相同操作,翻转,然后将两个数组中的“或”组合在一起:

>>> 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]])

一行中可能有多个对象吗?