Python 复制内部格式64 uint64

Python 复制内部格式64 uint64,python,numpy,uint64,Python,Numpy,Uint64,我正在使用Numpy和Python。我需要复制数据,而不需要在np.uint64和np.float64之间进行数字转换,例如1.5 0x3ff80000000000 我知道float.hex,但输出格式与uint64有很长的距离: In [30]: a=1.5 In [31]: float.hex(a) Out[31]: '0x1.8000000000000p+0' 我也知道另一种方式的各种字符串输入例程 有人能提出更直接的方法吗?毕竟,这只是简单的复制和类型更改,但是python/numpy

我正在使用Numpy和Python。我需要复制数据,而不需要在np.uint64和np.float64之间进行数字转换,例如
1.5 0x3ff80000000000

我知道float.hex,但输出格式与uint64有很长的距离:

In [30]: a=1.5
In [31]: float.hex(a)
Out[31]: '0x1.8000000000000p+0'
我也知道另一种方式的各种字符串输入例程


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

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

stdlib的ctypes附带的结构和联合功能 也许对你很好-不需要numpy。它有一个有效的联合类型 非常类似于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
模块:将数字打包为一个双精度字符串,然后将其解包为int。我认为它的可读性和效率都不如使用ctypes Union:

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

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

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

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

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

来自Rob Potter,谢谢-对于大型数据数组来说很好(在详细的逻辑设计之后,我们将有一段时间可以看到)。随机数测试非常有趣(当它工作时)谢谢,看起来不错。目的是验证高性能div、log、exp函数等的逻辑设计。谁喜欢IEEE 754?
>>> v = 1.5
>>> fa = np.array([v], dtype='float64')
>>> ua = np.frombuffer(fa, dtype='uint64')
>>> ua[0]
4609434218613702656      # 0x3ff8000000000000