Numpy中的映射

时间:2017-04-07 05:23:41

标签: python arrays list numpy bit-manipulation

给定一个3d numpy数组,我想提取数字的2个最低有效位:

例如,让

img = [[[30, 31, 32],
    [33, 34, 35],
    [36, 37, 38],
    [39, 40, 41],
    [42, 43, 44]],

   [[45, 46, 47],
    [48, 49, 50],
    [51, 52, 53],
    [54, 55, 56],
    [57, 58, 59]]]

其中每个像素[30,31,32]或[33,34,35] ......等等分别代表R,G,B值

我想提取2个最低有效位并连接这些数字以创建一个6位数字。

对于([30,31,32]),2 LSB分别为10,11和00。 然后将它连接在一起以产生101100,其为44的十进制数。目标是为给定数组中的每个“像素”制作一个数字列表。

我想对使用numpy操作和没有for循环给出的数组中的每个“像素”执行此操作。

1 个答案:

答案 0 :(得分:2)

该位屏蔽掉低两位,然后将每个三位移位,然后对它们求和:

img = [[[30, 31, 32],
    [33, 34, 35],
    [36, 37, 38],
    [39, 40, 41],
    [42, 43, 44]],

   [[45, 46, 47],
    [48, 49, 50],
    [51, 52, 53],
    [54, 55, 56],
    [57, 58, 59]]]

import numpy as np

print ((np.array(img) & 0b11) << np.array([4,2,0])).sum(axis=2)

打印哪些:

[[44 27  6 49 44]
 [27  6 49 44 27]]

我确信它可以做得更好但是这确实得到了所要求的结果。