在numpy数组中将3个值表示为1

时间:2019-06-16 01:20:49

标签: python numpy opencv

我正在尝试将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)

1 个答案:

答案 0 :(得分:1)

添加零列以使数组宽4个字节:

ar4 = np.insert(ar, 0, 0, 2)

然后简单地将其视为4字节整数的大端数组:

ar4.view('>u4')

这给出了:

array([[[16777215]],
       [[16717055]],
       [[   65535]],
       [[ 1444364]]], dtype=uint32)

这里唯一真正需要时间的步骤是np.insert(),因此,如果您能够在加载数据时添加该额外的列,则其余的转换基本上是免费的(即,不需要复制数据)。