如何从 Python 中的二进制数据中读取浮点值?
How to read float values from binary data in Python?
我有一个二进制文件,其中散布着数据段。我知道每个数据段的位置(字节偏移量)、这些数据段的大小以及数据点的类型(float、float32——这意味着每个数据点都由 4 个字节编码)。我想将这些数据段读入类似结构的数组(例如,numpy 数组或 pandas 数据帧),但我很难这样做。我试过使用 numpy 的内存映射,但它在最后一个数据段上短路,而 numpy 的文件只会让我得到奇怪的结果。
代码示例:
begin=datadf["$BEGINDATA"][0] #datadf is pandas.df that has where data begins and its size
buf.seek(begin) #buf is the file that is opened in rb mode
size=datadf["$DATASIZE"][0]+1 #same as the above
data=buf.read(size) #this should get me that data segment, but in binary
有没有办法从这个二进制数据可靠地转换为 float32。
为了进一步说明,我包括了前 10 个数据点的打印输出。
buf.seek(begin)
print(buf.read(40)) #10 points of float32 (4bytes) means 40
>>>b'\xa5\x10[@\x00\x00\x88@a\xf3\xf7A\x00\x00\x88@&\x93\x9bA\x00\x00\x88@\x00\x00\x00@\xfc\xcd\x08?\x1c\xe2\xbe?\x03\xf9\xa4?'
如果是任何值,虽然每个浮点数有4个字节(32位宽),但每个浮点数上限为最大值10 000
如果你想要numpy.ndarray
,你可以直接使用numpy.frombuffer
>>> import numpy as np
>>> data = b'\xa5\x10[@\x00\x00\x88@a\xf3\xf7A\x00\x00\x88@&\x93\x9bA\x00\x00\x88@\x00\x00\x00@\xfc\xcd\x08?\x1c\xe2\xbe?\x03\xf9\xa4?'
>>> np.frombuffer(data, dtype=np.float32)
array([ 3.422891 , 4.25 , 30.993837 , 4.25 , 19.44685 ,
4.25 , 2. , 0.5343931, 1.4912753, 1.2888492],
dtype=float32)
我有一个二进制文件,其中散布着数据段。我知道每个数据段的位置(字节偏移量)、这些数据段的大小以及数据点的类型(float、float32——这意味着每个数据点都由 4 个字节编码)。我想将这些数据段读入类似结构的数组(例如,numpy 数组或 pandas 数据帧),但我很难这样做。我试过使用 numpy 的内存映射,但它在最后一个数据段上短路,而 numpy 的文件只会让我得到奇怪的结果。
代码示例:
begin=datadf["$BEGINDATA"][0] #datadf is pandas.df that has where data begins and its size
buf.seek(begin) #buf is the file that is opened in rb mode
size=datadf["$DATASIZE"][0]+1 #same as the above
data=buf.read(size) #this should get me that data segment, but in binary
有没有办法从这个二进制数据可靠地转换为 float32。 为了进一步说明,我包括了前 10 个数据点的打印输出。
buf.seek(begin)
print(buf.read(40)) #10 points of float32 (4bytes) means 40
>>>b'\xa5\x10[@\x00\x00\x88@a\xf3\xf7A\x00\x00\x88@&\x93\x9bA\x00\x00\x88@\x00\x00\x00@\xfc\xcd\x08?\x1c\xe2\xbe?\x03\xf9\xa4?'
如果是任何值,虽然每个浮点数有4个字节(32位宽),但每个浮点数上限为最大值10 000
如果你想要numpy.ndarray
,你可以直接使用numpy.frombuffer
>>> import numpy as np
>>> data = b'\xa5\x10[@\x00\x00\x88@a\xf3\xf7A\x00\x00\x88@&\x93\x9bA\x00\x00\x88@\x00\x00\x00@\xfc\xcd\x08?\x1c\xe2\xbe?\x03\xf9\xa4?'
>>> np.frombuffer(data, dtype=np.float32)
array([ 3.422891 , 4.25 , 30.993837 , 4.25 , 19.44685 ,
4.25 , 2. , 0.5343931, 1.4912753, 1.2888492],
dtype=float32)