单个Numpy类型似乎不保留Endianness

时间:2012-12-06 09:12:28

标签: python numpy endianness

Numpy版本:1.6.2

有人可以解释为什么数组的单个标量不能保持dtype中设置的字节序吗?如何使用正确的字节顺序输出它们?

>>> numpy_type1 = numpy.uint32
>>> numpy_type2 = numpy.dtype(numpy_type1).newbyteorder('>')
>>> hexdump(numpy.array([100000000], dtype = numpy_type1).tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy.array([100000000], dtype = numpy_type2).tostring())
'05f5e100' # OKAY (byte swap is visible)
>>> hexdump(numpy.array([100000000], dtype = numpy_type1)[0].tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy.array([100000000], dtype = numpy_type2)[0].tostring())
'00e1f505' # FAIL (no byte swapping seen)
>>> hexdump(numpy_type1(100000000).tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy_type2.type(100000000).tostring())
'00e1f505' # FAIL (no byte swapping seen)

在上面的例子中,注意在numpy数组上调用tostring时正确执行了字节交换,但是在数组的标量元素上执行错误?

简单地说,我只需要一些方法来实例化dtype中的值,并以正确的字节顺序获取二进制字符串。我不能使用Python结构,因为它不支持Numpy所做的float16,float128或其他奇特的数字类型。我宁愿不手动进行字节交换。

我很想看到这项工作:

>>> hexdump(numpy_type2.type(100000000).tostring())
'05f5e100' # OKAY (byte swapping seen)

1 个答案:

答案 0 :(得分:1)

对于单个值,您也可以使用struct包。为简单起见,Scalars根本没有numpy(总是系统)的endianess。但是,您也可以使用0-d数组来保留字节顺序。但是对于大多数结果来说,numpy将0-d数组转换为标量,因为它们通常是你想要的。

由于您说您无法使用struct,因此您可以使用np.array(scalar, dtype=original.dtype).tostring(),即使它有点难看。