在列和行的范围内的Numpy数组操作
问题描述:
我有一个numpy布尔二维数组,表示一个灰度图像,它基本上是一个空白形状(三角形,正方形,圆形),由白色像素组成True
,黑色像素为False
。我想通过将白色像素修改为黑色像素来添加黑色填充。在列和行的范围内的Numpy数组操作
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
s False
,然后是True
,直到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,因此看起来更清晰一些。
这里的起始数组:
使用np.logical_and.accumulate
,翻转左到右,再次做同样的,翻转后,左到右
>>> 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]])
厚积薄发和“或”两列在一起:
>>> 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]])
沿行可能有多个对象吗? – Divakar
只是一个对象。 – Gmo