数组元素的布尔轮廓

Boolean Contour of Array Elements

我有以下数组

array = np.array(\
       [[  0,   0,   0,   0,   0,   0,   0,   0,   0, 255],
       [   0,   0,   0,   0,   0,   0,   0, 255, 255, 255],
       [   0,   0,   0,   0,   0, 255, 255, 255, 255, 255],
       [   0,   0,   0, 255, 255, 255, 255, 255, 255, 255],
       [   0, 255, 255, 255, 255, 255, 255, 255, 255, 255]])

我想得到一个布尔数组,只要上一个元素和下一个元素不同(或者如果它在数组的边缘),该数组的值为 True:

[[ True  True  True  True  True  True  True  True  True False]
 [ True False False False False  True  True False False False]
 [ True False False  True  True False False False False False]
 [ True True  True False False False False False False False]
 [ True False False False False False False False False False]]

目前我尝试过的: 如果下一个邻居不同,我会查找每一行:

row = np.array([np.append(row[:-1] != row[1:],False) for row in mapped_image])

对于每一列:

column = []
rowAbove = mapped_image[0]
for row in mapped_image[1:]:
    column .append(rowAbove != row)
    rowAbove = row
column .append(["True"]*len(row))

...但是我很难将它们合并在一起并添加边缘。我可以尝试解决这个问题吗?

IIUC,您想屏蔽差异不为零的连续元素(边缘除外)。你可以看看 np.diff 这个:

diff_y = np.diff(array, append=255, axis=-2)
# True if it's on the edge of the array
diff_y[:,0] = 255
diff_y[0,:] = 255

print(diff_y != 0)

输出:

[[ True  True  True  True  True  True  True  True  True  True]
 [ True False False False False  True  True False False False]
 [ True False False  True  True False False False False False]
 [ True  True  True False False False False False False False]
 [ True False False False False False False False False False]]

这不是您想要的确切输出,但这可能会给您一些想法。