【问题标题】:Boolean Contour of Array Elements数组元素的布尔轮廓
【发布时间】:2021-07-06 21:14:52
【问题描述】:

我有以下数组

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

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

【问题讨论】:

  • Wrt “只要上面和下一个元素不同,该值就是 True” - 彼此不同还是与元素不同?在结果的最后一行中,第一个值有True,当它上面的值是0并且它旁边(右侧)是255。然后最后一行的第三个元素是False,但上面也有0它和255之后。它们都应该是 True 或 False。并且这些位置的原始值是 0 和 255。因此,它们应该具有相同的结果。顺便说一句,顶行和最右边的列显示为 all True。为什么右上角和最右边一列都是False?

标签: python numpy boolean


【解决方案1】:

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

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

【讨论】:

  • 嗨凯文,非常感谢您的回答!实际上,您如何看待通过在数组周围添加 255 的人工边界来扩充原始数组,然后执行 np.diff() 并“切掉”有用的布尔部分。您如何看待这种方法?
  • 嗨,我想它可能会起作用。 np.pad(array, [1,1], constant_values=255) 将创建人造边界。
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多