bytearray
(使用Python 2.7.11,但在3.4.3中确认了相同的行为):In [80]: from array import array
In [81]: import numpy as np
In [82]: a1 = array('L', [1, 3, 2, 5, 4])
In [83]: a2 = np.asarray([1,3,2,5,4], dtype=int)
In [84]: b1 = bytearray(a1)
In [85]: b2 = bytearray(a2)
由于array.array
和numpy.ndarray
都支持缓冲区协议,因此我希望在转换为bytearray
时两者都导出相同的基础数据。
但是上述数据:
In [86]: b1
Out[86]: bytearray(b'\x01\x03\x02\x05\x04')
In [87]: b2
Out[87]: bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00')
一开始我以为对NumPy数组进行一个单纯的bytearray
调用可能会由于数据类型、连续性或其他开销数据而无意中获取一些额外的字节。
但即使直接查看NumPy缓冲区数据句柄,它仍然显示大小为40并提供相同的数据:
In [90]: a2.data
Out[90]: <read-write buffer for 0x7fb85d60fee0, size 40, offset 0 at 0x7fb85d668fb0>
In [91]: bytearray(a2.data)
Out[91]: bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00')
相同的错误也会出现在
a2.view()
中:In [93]: bytearray(a2.view())
Out[93]: bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00')
我注意到如果我给出dtype=np.int32
,那么bytearray(a2)
的长度为20而不是40,这表明额外的字节与类型信息有关 -- 只是不清楚为什么或如何:
In [20]: a2 = np.asarray([1,3,2,5,4], dtype=int)
In [21]: len(bytearray(a2.data))
Out[21]: 40
In [22]: a2 = np.asarray([1,3,2,5,4], dtype=np.int32)
In [23]: len(bytearray(a2.data))
Out[23]: 20
据我所知,
np.int32
应该对应于 array
的类型码 'L'
,但任何有关为什么不是的解释都将非常有帮助。如何可靠地提取只有 "应该" 通过缓冲区协议导出的数据部分......也就是说,在这种情况下与纯
array
数据看起来相同。