我正在尝试将3通道numpy数组转换为单通道numpy数组。我想使用以下方法将所有3个元素值组合为1个数字:
x << 16 + y << 8 + z
下面的代码可以做到这一点,但似乎使很多数字为零。那是对的吗?还是我做错了什么?最后两个数字应该是零还是其他?
ar = np.array((
((255,255,255),),
((255,20,255),),
((0,255,255),), # this becomes zero, is that correct?
((22,10,12),), # this becomes zero, is that correct?
), dtype='uint8')
c1,c2,c3 = cv2.split(ar)
single = np.int32(c1) << 16 + np.int32(c2) << 8 + np.int32(c3)
print(single)
print(ar.shape)
[[1069547520]
[522240]
[0]
[0]]
(4,1,3)
答案 0 :(得分:1)
添加零列以使数组宽4个字节:
ar4 = np.insert(ar, 0, 0, 2)
然后简单地将其视为4字节整数的大端数组:
ar4.view('>u4')
这给出了:
array([[[16777215]],
[[16717055]],
[[ 65535]],
[[ 1444364]]], dtype=uint32)
这里唯一真正需要时间的步骤是np.insert()
,因此,如果您能够在加载数据时添加该额外的列,则其余的转换基本上是免费的(即,不需要复制数据)。