Python:将numpy数组(int)写入二进制文件而不填充
我有一个用Fortran创建的二进制文件,其中包含作为记录的整数值。我想将它们读入Python,将它们作为列表编辑,并将它们作为np数组保存回二进制。然而,出于某种原因,Python在文件中的每条记录之后插入一个额外的“0”。我猜这就是他们所谓的“填充”,对吗?如何抑制这种情况 下面是一个独立的示例:Python:将numpy数组(int)写入二进制文件而不填充,python,python-2.7,numpy,io,binary,Python,Python 2.7,Numpy,Io,Binary,我有一个用Fortran创建的二进制文件,其中包含作为记录的整数值。我想将它们读入Python,将它们作为列表编辑,并将它们作为np数组保存回二进制。然而,出于某种原因,Python在文件中的每条记录之后插入一个额外的“0”。我猜这就是他们所谓的“填充”,对吗?如何抑制这种情况 下面是一个独立的示例: import numpy as np content = np.array(range(20)) # Write: with open('D:/bin_test.dat', 'wb') as
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二进制文件,并直接将其保存回二进制文件,它就可以正常工作。这就是为什么我猜问题发生在从list到numpy数组的转换之后
谢谢 检查
content.dtype
。它看起来像是np.int32
,这通常是Windows上的默认整数类型。您正在写入32位整数,但试图将其读回16位整数。因此,结果中的其他每一个值都是0。检查content.dtype
。它看起来像是np.int32
,这通常是Windows上的默认整数类型。您正在写入32位整数,但试图将其读回16位整数。因此,结果中的每一个值都是0。我没有Python 2.7(该代码在Python 2.6上不起作用),但是在Python 3.6上,如果将数据类型更改为dtype=np.int32
,那么您的代码会执行您想要的操作。请检查content.dtype
。它看起来像是np.int32
,这通常是Windows上的默认整数类型。您正在写入32位整数,但试图将其读回16位整数。所以结果中的其他值都是0。有时候就这么简单……是的,我一直在尝试在Fortran中使用16位整数来节省HDD空间,但没有意识到numpy默认创建int32数组。好吧,问题解决了。非常感谢。好的,我将添加我的注释作为回答。我没有Python 2.7(并且该代码在Python 2.6上不起作用),但是在Python 3.6上,如果您将数据类型更改为dtype=np.int32
,那么您的代码将执行您想要的操作。请检查content.dtype
。它看起来像是np.int32
,这通常是Windows上的默认整数类型。您正在写入32位整数,但试图将其读回16位整数。所以结果中的其他值都是0。有时候就这么简单……是的,我一直在尝试在Fortran中使用16位整数来节省HDD空间,但没有意识到numpy默认创建int32数组。好吧,问题解决了。非常感谢。好的,我将添加我的评论作为回答。