将2D numpy数组替换为3D(元素到向量)



这个问题以前可能有人问过,所以我很高兴能找到答案,但我找不到。

我有一个TrueFalse的2D numpy数组。现在我需要将其转换为黑白图像(3D numpy数组(,也就是说,我需要[0,0,0]来代替每个False,需要[1,1,1]来代替每一个True。最好的方法是什么?例如,

Input:
[[False, True],
[True, False]]
Output:
[[[0, 0, 0], [1, 1, 1]],
[[1, 1, 1], [0, 0, 0]]]

(您可能知道,3D图像是形状为(height, width, 3)的阵列,其中3是深度维度,即通道数量。(

如果有人能告诉我如何将其转换回来,也就是说,如果我有一个纯黑白图像(纯[0,0,0]和[0,0,1]像素(,我如何获得相同高度和宽度尺寸的2D矩阵,但用True代替白色像素([1,1,1](,用False代替黑色像素([0,0,0](。

最便宜的方法是将bool数据视为np.uint8,并添加一个伪维度:

img = np.lib.stride_tricks.as_strided(mask.view(np.uint8),
strides=mask.strides + (0,),
shape=mask.shape + (3,))

mask.astype(np.uint8)不同,mask.view(np.uint8)不复制数据,而是利用bool_存储在单个字节中的事实。类似地,np.lib.stride_tricks.as_strided创建的新维度是一个不复制任何数据的视图。

您可以通过手动创建一个新的数组对象来绕过as_stridedview

img = np.ndarray(shape=mask.shape + (3,), dtype=np.uint8,
strides=mask.strides + (0,), buffer=mask)

我认为最清晰的方法是:

a = np.array([[False, True], [True, False]])
out = np.zeros((*a.shape, 3), dtype=np.uint8)
out[a.nonzero()] = 1
>>> out
array([[[0, 0, 0],
[1, 1, 1]],
[[1, 1, 1],
[0, 0, 0]]], dtype=uint8)

最新更新