通过解包打包的rgb numpy数组来创建新numpy数组的Pythonic方法

2024-03-29 09:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我试图解压这个数组,然后使用解压后的值创建一个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])

如上所示,在for循环中使用unpack_rgb将颜色值分配给numpy数组c我正在寻找解包和创建新numpy数组的pythonic方法。

变量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)])

Tags: 代码inimportnumpyforreturndefnp
2条回答

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

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

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

相关问题 更多 >