使用numpy将整数转换为位数组

4
我需要一种将2000万个32位和64位整数转换为相应的位数组的方法(因此必须具有内存/时间效率)。在SO上受到不同问题/答案的建议下,我尝试使用numpy.unpackbits来实现这一点。在尝试这种方法时,我遇到了意外的结果:
np.unpackbits(np.array([1], dtype=np.uint64).view(np.uint8))

产生:

array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)

我希望 1 元素应该是最后一个,而不是在中间。所以显然我缺少保留字节顺序的东西。我缺少什么?

我没有看到证明这一点的文档,但是我假设当我创建一个类型为int64的数组,并用比其大小更小的数据填充它时,每个元素都会被强制转换为长整型。也就是说,在C语言中等同于cast操作,应该会在高位补充0 - Dmitry B.
两千万!但我希望不是手动编辑的 O_o。 - linusg
2
此答案建议您阅读此链接,以了解更多信息:http://docs.scipy.org/doc/numpy/user/basics.byteswapping.html。 - Robᵩ
@StevenRumbalski:我不行。np.unpackbits需要一个字节数组。 - Dmitry B.
@Robᵩ:那就是我得到灵感的问题/答案。我确实看了那个链接,但我认为它不适用于这里,因为我的数据(1)是在运行Python进程的同一台计算机上生成的。我可以再找其他线索。 - Dmitry B.
1个回答

7
尝试使用dtype='>i8'进行设置,如下所示:
In [6]: np.unpackbits(np.array([1], dtype='>i8').view(np.uint8))
Out[6]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype=uint8)

Reference:

http://docs.scipy.org/doc/numpy/user/basics.byteswapping.html


哎呀!好吧,我应该读完前几段的内容。 - Dmitry B.
虽然我仍然不明白为什么在我的情况下必须这样做,因为数据是在相同的内存架构下生成和消耗的。 - Dmitry B.
2
因为你的电脑是小端字节序,而你要求使用大端字节序表示。 - Robᵩ
你要求使用大端字节序表示。我的初始代码没有做任何字节顺序的请求。view 默认假定底层数据是大端字节序吗?我认为 view(np.uint8) 只会简单地按字节读取内存,这意味着那里的数据已经按大端字节序排列了(所以是什么在小端系统上强制执行了该顺序)。 - Dmitry B.
2
我的意思是,在你的问题中,“你”而不是你的程序,要求大端表示法。你反对的表示法是小端。 - Robᵩ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接