【问题标题】:Python: write numpy array (int) to binary file without paddingPython:将numpy数组(int)写入二进制文件而无需填充
【发布时间】:2017-02-12 18:10:57
【问题描述】:

我有一个在 Fortran 中创建的二进制文件,其中包含作为记录的整数值。我想将这些读入 Python,将它们编辑为列表并将它们作为 np-arrays 保存回二进制文件。然而,出于某种原因,Python 在文件中的每条记录之后插入了一个额外的“0”。我想这就是他们所说的“填充”,对吧?我该如何抑制这个?

这是一个独立的例子:

import numpy as np

content = np.array(range(20))

# Write:
with open('D:/bin_test.dat', 'wb') as write_binary:
    write_binary.writelines(content)

# Read: 
with open('D:/bin_test.dat', 'rb') as read_binary:
    content = np.fromfile(read_binary, dtype=np.int16)

print content

Out: 
[ 0  0  1  0  2  0  3  0  4  0  5  0  6  0  7  0  8  0  9  0 10  0 11
0 12 0 13  0 14  0 15  0 16  0 17  0 18  0 19  0]

如果我通过np.fromfile 读取 Fortran 二进制文件并将其直接保存回二进制文件,它就可以正常工作。这就是为什么我猜从列表转换为numpy数组后会出现问题。

谢谢!

【问题讨论】:

  • 我没有 Python 2.7(并且该代码在 Python 2.6 上无法运行),但在 Python 3.6 上,如果您将数据类型更改为 dtype=np.int32,您的代码就会执行您想要的操作。跨度>
  • 检查content.dtype。貌似是np.int32,一般是Windows上默认的整数类型。您正在编写 32 位整数,但随后尝试将它们作为 16 位整数读回。所以结果中的所有其他值都是 0。
  • 有时就这么简单...是的,我一直在尝试通过在 Fortran 中使用 16 位整数来节省硬盘空间,但没有意识到 numpy 默认创建 int32 数组。嗯,好的,问题解决了。谢谢!
  • 好的,我会添加我的评论作为答案。

标签: python python-2.7 numpy io binary


【解决方案1】:

检查content.dtype。貌似是np.int32,一般是Windows上默认的整数类型。您正在编写 32 位整数,但随后尝试将它们作为 16 位整数读回。所以结果中的所有其他值都是 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多