gpt4 book ai didi

python - 使用 numpy fromfile 结合 lzma open 读取二进制文件

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:13 26 4
gpt4 key购买 nike

我有一个包含 double 值(64 位 float 据)的二进制文件。使用 numpy fromfile

>>> data1 = numpy.fromfile(open('myfile', 'rb'))

我收到了正确的数据(我使用 data1 = numpy.fromfile('myfile') 获得了相同的数据)

>>> data1
array([ 1.29000000e-07, 3.70000000e-08, 3.80000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.80000000e-08, 3.70000000e-08, 3.80000000e-08,
3.60000000e-08, 3.80000000e-08, 3.70000000e-08,
3.60000000e-08, 3.60000000e-08, 3.80000000e-08,
3.50000000e-08, 3.80000000e-08, 3.80000000e-08,
3.80000000e-08, 3.60000000e-08, 3.70000000e-08,
3.60000000e-08, 3.70000000e-08, 3.70000000e-08,
3.60000000e-08, 3.50000000e-08, 3.70000000e-08,
3.70000000e-08, 3.60000000e-08, 3.50000000e-08,
3.80000000e-08, 3.80000000e-08, 3.60000000e-08,
3.50000000e-08, 3.90000000e-08, 3.70000000e-08,
3.70000000e-08, 3.70000000e-08, 3.50000000e-08,
3.70000000e-08, 3.60000000e-08, 3.70000000e-08,
3.80000000e-08, 3.90000000e-08, 3.90000000e-08,
3.60000000e-08, 3.60000000e-08, 3.70000000e-08,
3.60000000e-08, 3.80000000e-08, 3.70000000e-08,
3.50000000e-08, 3.50000000e-08, 3.60000000e-08,
3.60000000e-08, 3.70000000e-08, 3.50000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.80000000e-08, 3.80000000e-08, 3.80000000e-08,
3.90000000e-08, 3.90000000e-08, 3.50000000e-08,
3.80000000e-08, 3.80000000e-08, 3.70000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.60000000e-08, 3.70000000e-08, 3.70000000e-08,
3.80000000e-08, 3.60000000e-08, 3.60000000e-08,
3.50000000e-08, 3.80000000e-08, 3.60000000e-08,
3.70000000e-08, 3.60000000e-08, 3.80000000e-08,
3.50000000e-08, 3.80000000e-08, 3.70000000e-08,
3.60000000e-08, 3.70000000e-08, 3.90000000e-08,
3.60000000e-08, 3.60000000e-08, 3.90000000e-08,
3.80000000e-08, 3.60000000e-08, 3.60000000e-08,
3.70000000e-08, 3.70000000e-08])

我现在使用 xz 压缩此文件

xz -k myfile

然后尝试使用lzma模块读取Python中的数据

>>> data2 = numpy.fromfile(lzma.open('myfile.xz'))
>>> data2
array([ 2.05244522e-289, 3.09873319e-303, -9.10852154e-136,
9.99900586e-150, -7.22647881e+061, -3.03508634e-168,
1.40409926e+097, -8.66961452e+219, 2.28992199e-308,
-7.28706929e+173, 1.41101250e+029, -2.94590886e-279,
7.21680144e+171, -4.62715868e+045, 3.05536517e-138,
-2.94268247e-043, -1.54563603e-295, 7.53024241e+102,
-1.22865109e+263, 2.62485731e+044, 4.52556260e-312,
1.18164036e-240, 3.56496646e-311, -2.82751232e+286,
1.69336097e+127])

为什么会发生这种情况?通过read查看文件对象的内容给出

>>> open('myfile', 'rb').read()
b'B$\xf7\xffgP\x81>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x85U\xef\x82\x1e\xf0d>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\xb3z\xea\x05]\xcab>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x85U\xef\x82\x1e\xf0d>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>'
>>> lzma.open('myfile.xz').read()
b'B$\xf7\xffgP\x81>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\x85U\xef\x82\x1e\xf0d>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\xb3z\xea\x05]\xcab>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\xb3z\xea\x05]\xcab>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x85U\xef\x82\x1e\xf0d>\x85U\xef\x82\x1e\xf0d>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\xd1\x1e\xae#\xaefd>\xb3z\xea\x05]\xcab>\xd1\x1e\xae#\xaefd>\x1c\xe8l\xc4=\xddc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x85U\xef\x82\x1e\xf0d>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x85U\xef\x82\x1e\xf0d>\xd1\x1e\xae#\xaefd>g\xb1+e\xcdSc>g\xb1+e\xcdSc>\x1c\xe8l\xc4=\xddc>\x1c\xe8l\xc4=\xddc>'

这对我来说看起来不错。类型似乎也正确:

>>> type(data1)
<class 'numpy.ndarray'>
>>> type(data1[0])
<class 'numpy.float64'>

>>> type(data2)
<class 'numpy.ndarray'>
>>> type(data2[0])
<class 'numpy.float64'>

我希望数组 data1data2 的内容相等。

最佳答案

所以,我不知道该解决方案的原因,但我有一个。我从 tofile 生成了一个文件方法。

我使用frombuffer读取了压缩版本。

data_xz = np.frombuffer(lzma.open('data.bin.xz', mode='rb').read())
data_bin = np.fromfile('data.bin')

读取时数据相等。

我的猜测是,在某个地方,np.fromfile 读取字节的处理揭示了普通读取方法和 lzma 模块中的方法的差异。

无论如何,存储数据最好使用一致的格式。对于小数据集,纯文本就可以了。另外,还有 joblib 的 persistence moduleHDF5 for Python .

关于python - 使用 numpy fromfile 结合 lzma open 读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46601727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com