用3d替换2d numpy数组(元素到向量)

vltsax25  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(436)

这个问题以前可能有人问过,所以我很高兴能找到答案,但我找不到。
我有一个2d numpy数组 True 以及 False . 现在我需要将它转换成黑白图像(一个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]像素),我如何得到一个同样高宽尺寸的二维矩阵 True 代替白色像素([1,1,1]),以及 False 代替黑色像素([0,0,0])。

7y4bm7vi

7y4bm7vi1#

最便宜的方法是查看您的 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_strided 以及 view 通过手动创建新的数组对象:

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

x8goxv8g2#

我认为最清楚的方法是:

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)

相关问题