拷贝内部格式float64 uint64



我使用Numpy和Python。我需要复制数据,没有数字转换之间的np。Uint64和np。float64,例如1.5 <-> 0x3ff8000000000000 .

我知道浮动。十六进制,输出格式与uint64:

相差甚远。
In [30]: a=1.5
In [31]: float.hex(a)
Out[31]: '0x1.8000000000000p+0'

我还知道其他方式的各种字符串输入例程

谁能提出更直接的方法?毕竟,这只是简单的复制和类型更改,但python/numpy似乎对转换数据非常严格。

使用中间数组和frombuffer方法将一种数组类型"强制转换"为另一种数组类型:

>>> v = 1.5
>>> fa = np.array([v], dtype='float64')
>>> ua = np.frombuffer(fa, dtype='uint64')
>>> ua[0]
4609434218613702656      # 0x3ff8000000000000

由于frombuffer在原始缓冲区中创建了一个视图,因此即使在大型数组中重新解释数据也很有效。

因此,您需要看到内存中表示float64的8个字节为整数。(将int64数表示为十六进制字符串是另一回事

与标准库的ctypes捆绑在一起的Struct和Union功能可能对你很好,没必要犯傻。它有一个可以工作的Union类型非常像C语言的联合,并允许您这样做:

>>> import ctypes
>>> class Conv(ctypes.Union):
...   _fields_ = [ ("float", ctypes.c_double), ("int", ctypes.c_uint64)]
... 
>>> c = Conv()
>>> c.float = 1.5
>>> print hex(c.int)
0x3ff8000000000000L

内置的"hex"函数是一种获取数字十六进制表示的方法。

您也可以使用struct模块:将数字打包为双精度字符串,并将其解包为整型。我认为它的可读性和效率都不如使用ctypes Union:

>>> inport struct
>>> hex(struct.unpack("<Q",  struct.pack("<d", 1.5))[0])
'0x3ff8000000000000'

由于您使用的是numpy,因此您可以简单地更改数组类型,"动态地",并将所有数组操作为整数,复制为0:

>>> import numpy
>>> x = numpy.array((1.5,), dtype=numpy.double)
>>> x[0]
1.5
>>> x.dtype=numpy.dtype("uint64")
>>> x[0]
4609434218613702656
>>> hex(x[0])
'0x3ff8000000000000L'

这是迄今为止最有效的方法,无论您获取float64数字的原始字节的目的是什么。

相关内容

  • 没有找到相关文章

最新更新