将python float转换为字节

我想将Python浮点数转换为字节数组,将其编码为32位小尾数IEEE浮点数,以便将其写入二进制文件。

在Python 3中执行此操作的现代Pythonic方法是什么?对于整数,我可以做my_int.to_bytes(4,'little'),但是没有to_bytes的浮点方法。

如果我可以一次为numpy数组中的每个浮点数(使用dtype numpy.float32)做到这一点,那就更好了。但是请注意,我需要将其作为字节数组获取,而不仅仅是立即将数组写入文件中。

有一些听起来相似的问题,但它们似乎主要与获取十六进制数字有关,而不是写入二进制文件。

wangshaozhuang 回答:将python float转换为字节

NumPy数组带有tobytes方法,可为您转储其原始数据字节:

arr.tobytes()

您可以指定一个order参数,以对多维数组使用C阶(行大写)或F阶(列大写)。

由于您要将字节转储到文件中,因此您可能还对tofile方法感兴趣,该方法将字节直接转储到文件中:

arr.tofile(your_file)

tofile始终使用C顺序。

如果需要更改字节序,可以使用byteswap方法。 ({newbyteorder具有更方便的签名,但不会更改基础字节,因此不会影响tobytes。)

import sys
if sys.byteorder=='big':
    arr = arr.byteswap()
data_bytes = arr.tobytes()
,

使用正确的dtype,您可以将数组的数据缓冲区写入字节串或二进制文件:

In [449]: x = np.arange(4.,dtype='<f4')                                        
In [450]: x                                                                     
Out[450]: array([0.,1.,2.,3.],dtype=float32)
In [451]: txt = x.tostring()                                                    
In [452]: txt                                                                   
Out[452]: b'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@'
In [453]: x.tofile('test')                                                                                                                           
In [455]: np.fromfile('test','<f4')                                             
Out[455]: array([0.,dtype=float32)
In [459]: with open('test','br') as f: print(f.read())                          
b'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@'

更改结尾:

In [460]: x.astype('>f4').tostring()                                            
Out[460]: b'\x00\x00\x00\x00?\x80\x00\x00@\x00\x00\x00@@\x00\x00'
,

您可以使用structpackbytes

>>> import struct
>>> struct.pack('<f',3.14) # little-endian
b'\xc3\xf5H@'
>>> struct.pack('>f',3.14) # big-endian
b'@H\xf5\xc3'
,

save/savez中有numpy个方法:

将数据存储到磁盘,然后再次加载:

>>> np.save('/tmp/123',np.array([[1,2,3],[4,5,6]]))
>>> np.load('/tmp/123.npy')
array([[1,6]])

将压缩数据存储到磁盘,然后再次加载:

>>> a=np.array([[1,6]])
>>> b=np.array([1,2])
>>> np.savez('/tmp/123.npz',a=a,b=b)
>>> data = np.load('/tmp/123.npz')
>>> data['a']
array([[1,6]])
>>> data['b']
array([1,2])
>>> data.close()
本文链接:https://www.f2er.com/3119342.html

大家都在问