通过拆包已打包的rgb-numpy数组来创建新numpy数组的Python方法



我有一个形状为(N,)numpy数组,它包含使用以下公式的N个压缩rgb值-

rgb = (r<<16) + (g<<8) + b

我正在尝试解压缩这个数组,然后使用解压缩的值创建一个形状为(N,3)numpy数组。请参阅下面的代码片段-

import numpy as np
def unpack_rgb(rgb):
b =  rgb & 255
g = (rgb >> 8) & 255
r =   (rgb >> 16) & 255
return r, g, b
N = 10
c = (np.ones((N, 3)) * 255).astype(np.uint8)
for i in range(N):
c[i, 0], c[i, 1], c[i, 2] = unpack_rgb(colors[i])

如上所示,unpack_rgbfor循环中用于将颜色值分配给numpy数组c我正在寻找一种Python方式来解包并创建一个新的numpy数组

变量colors可以通过以下代码获得-

from random import randint
def pack_rgb(r, g, b):
rgb = (r<<16) + (g<<8) + b
return rgb
colors = np.array([pack_rgb(randint(0, 255), randint(0, 255), randint(0, 255)) for _ in range(N)])

您可以在整个numpy数组上运行逐位运算符,然后使用np.dstack来获得(r,g,b(元组,如:

unpacked_colors = ((colors >> 16) & 255, (colors >> 8) & 255, colors & 255)
rgbs = np.dstack(unpacked_colors)

看起来c没用?只需在默认np.array构造函数中使用元组

np.array([unpack_rgb(colors[_]) for _ in range(N)])
array([[203, 157, 217],
[169, 143,  86],
[192, 127,   8],
[114,  32, 141],
[153,  39,   1],
[ 14,  17,  57],
[200,  72, 146],
[133, 173, 139],
[ 35,  88,  40],
[ 22,  38, 144]], dtype=uint8)

最新更新