通过解压缩打包的RGB numpy数组创建新的numpy数组的Python方法

时间:2018-07-24 14:55:55

标签: python arrays numpy

我有一个形状为numpy的{​​{1}}数组,其中使用以下公式包含N个压缩的rgb值-

(N,)

我试图解压缩此数组,然后使用解压缩的值创建形状为rgb = (r<<16) + (g<<8) + b 的{​​{1}}数组。参见下面的代码片段-

numpy

如上所示,在(N,3)循环内使用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]) 将颜色值分配给numpy数组unpack_rgb我正在寻找解压缩并创建新的numpy数组的pythonic方法。

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

c

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

好像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)