当前位置:  开发笔记 > 编程语言 > 正文

ndarray.tofile的奇怪行为

如何解决《ndarray.tofile的奇怪行为》经验,为你挑选了1个好方法。

我正在转向Matlab到NumPy/SciPy,似乎np.fromfile和ndarray.tofile分别在matlab中对fread和fwrite进行了修改.

为了测试这些API,我首先创建了一个二进制文件,其中包含五个整数{1,2,3,4,5},采用二进制'int32'格式.

然后,我使用np.fromfile读取此文件.

In [365]:

in_file = open('12345.bin', 'rb'); x = np.fromfile(in_file, 'int32'); in_file.close()

我检查它已成功读取,如下所示:

In [367]:

x

Out[366]:
array([1, 2, 3, 4, 5], dtype=int32)

现在,我将其写为具有不同名称的文件.我的期望是这个输出文件应该与原始输入文件完全相同,即'12345.bin'.

In [368]:


out_file = open('12345out.bin', 'wb'); x.tofile(out_file, 'int32'); out_file.close()

但令人惊讶的是,'12345out.bin'的大小是25个字节,而'12345.bin'是20个字节.出了点问题.我打开'12345out.bin'如下:

In [369]:

in_file = open('12345out.bin', 'rb'); x2 = np.fromfile(in_file, 'int32'); in_file.close()

In [370]:

x2

Out[370]:
array([1953392945, 1764897331,  842232942, 1953392947, 1765028403,
        842232942], dtype=int32)

因此,从上面的结果来看,我们发现某些事情是完全错误的.Coud有谁请帮助我,我做错了什么?



1> DSM..:

tofile不需要类型参数(这是它不是一个很好的工具的原因之一,因为它不保留类型信息).所以,当你这样做

x.tofile(out_file, 'int32')

你实际上是说你希望以文本格式使用字符串 "int32"作为分隔符:

>>> x = np.arange(1,6,dtype=np.int32)
>>> x.tofile(open("tmp.dat", "wb"), "int32")
>>> open("tmp.dat","rb").read()
b'1int322int323int324int325'

代替:

>>> x = np.arange(1,6,dtype=np.int32)
>>> x.tofile(open("tmp.dat", "wb"))
>>> open("tmp.dat","rb").read()
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00'
>>> np.fromfile("tmp.dat", "int32")
array([1, 2, 3, 4, 5])

(请注意,我懒得使用with块来打开和关闭文件,因为我应该这样做.)

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有