我有一个形状为(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_rgb
在for
循环中用于将颜色值分配给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)