如何使用np.unpackbits解包uint32阵列

2024-04-25 06:23:03 发布

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

我使用一段代码创建了一个2D二进制值数组,以覆盖事件的所有可能场景。在第一轮中,我用两名成员对其进行了测试

这是我的密码:

number_of_members = 2
n = number_of_members
values = np.arange(2**n, dtype=np.uint8).reshape(-1, 1)
print('$$$ ===> ', values)
bin_array = np.unpackbits(values, axis=1)[:, -n:]
print('*** ===> ', bin_array)

结果是:

$$$ ===>  [[0]
           [1]
           [2]
           [3]]
*** ===>  [[0 0]
           [0 1]
           [1 0]
           [1 1]]

如您所见,它正确地提供了我的2D二进制数组

当我打算使用number_of_members = 20时,问题就开始了。如果我将20分配给number_of_members,python将显示以下结果:

$$$ ===>  [[  0]
           [  1]
           [  2]
           ...
           [253]
           [254]
           [255]]
*** ===>  [[0 0 0 ... 0 0 0]
           [0 0 0 ... 0 0 1]
           [0 0 0 ... 0 1 0]
           ...
           [1 1 1 ... 1 0 1]
           [1 1 1 ... 1 1 0]
           [1 1 1 ... 1 1 1]]

结果有8列,但我希望数组有32列。如何解压缩uint32数组


Tags: of代码密码numberbinnp场景二进制
1条回答
网友
1楼 · 发布于 2024-04-25 06:23:03

正如您正确指出的,^{}只在uint8数组上运行。很好的一点是,您可以将任何类型视为uint8。您可以像这样在数据中创建一个uint32^{}

view = values.view(np.uint8)

在我的机器上,这是小endian,它使修剪更容易。您可以在所有系统中有条件地强制小端点顺序:

if values.dtype.byteorder == '>' or (values.dtype.byteorder == '=' and sys.byteorder == 'big'):
    view = view[:, ::-1]

现在你可以把这些东西拆开了。事实上,unpackbits有一个我个人添加的很好的特性,count参数。它允许您将输出长度精确地设置为20位,而不是完整的32位,而无需进行子集设置。由于输出将混合使用大端位和小端位字节,因此我建议也以小端位顺序显示这些位,并翻转整个结果:

bin_array = np.unpackbits(view, axis=1, count=20, bitorder='little')[:, ::-1]

结果是一个(1<<20, 20)数组,具有您想要的精确值

相关问题 更多 >