2016-05-12 62 views
0

我需要一种方法将2000万个32位和64位整数转换为相应的位数组(因此这必须具有内存/时间效率)。在SO的另一个question/answer的建议下,我试图通过使用numpy.unpackbits来做到这一点。虽然用这种方法尝试我遇到了意想不到的结果:使用numpy将int转换为位数组

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元素成为最后一个,但不是在中间。所以我显然错过了保留字节顺序的东西。我错过了什么?

+0

我没有看到文件证明这一点,但我认为,当我创建一个类型的Int64的数组,用更小的数据填充它,每个元素都会被投入一长串。即等同于C语言,它应该使用'0'填充更高位。 –

+0

2000万!但我希望不要编辑O_o – linusg

+2

[This answer](http://stackoverflow.com/a/18296281/8747)建议你阅读[this link](http://docs.scipy.org/doc/numpy/user /basics.byteswapping.html)。 –

回答

6

尝试: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) 

参考:

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

+0

D'oh !.好吧,我应该读过前几段。 –

+0

虽然我仍然不明白为什么我必须在我的情况下这样做,因为数据是在相同的内存架构下生成和使用的。 –

+2

因为你的电脑是小端,你已经要求一个大端代表。 –