gpt4 book ai didi

python - ndarray.tofile 的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 21:48:53 24 4
gpt4 key购买 nike

我正在将 Matlab 切换到 NumPy/SciPy,似乎 np.fromfile 和 ndarray.tofile 分别对应于 Matlab 中的 fread 和 fwrite。

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

然后,我使用 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)

所以,从上面的结果来看,我们发现有些事情是完全错误的。谁能帮我解决我做错了什么?

最佳答案

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

x.tofile(out_file, 'int32')

你实际上是说你想使用 string "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 block 来打开和关闭文件。)

关于python - ndarray.tofile 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504381/

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