如果我们已经有了numpy.load,为什么我们需要numpy.fromfile?

时间:2019-06-30 13:55:00

标签: python-3.x numpy

numpy.fromfile

根据SciPy文档

  

根据文本或二进制文件中的数据构造数组。 [...]数据   使用tofile方法编写的代码可以使用此函数读取。

所以我只是按照说明使用tofile

创建文件
import numpy as np
A = np.random.rand(1000)
A.tofile('binary_file') # saving a dummy binary_file

x1 = np.fromfile('binary_file') # loading the dummy file

print(np.array_equal(A, x1)) # checking if the arrays are the same
>>> True

numpy.load

同时,我们还有np.savenp.load,它们分别以tofilefromfile的形式保存工作

np.save('file.npy',A)
x2 = np.load('file.npy')
print(np.array_equal(A, x1))
>>> True

fromfile == np.load

两种加载方法产生的结果相同,如下所示

print(np.array_equal(x1, x2))
>>> True

那为什么同时需要两个功能?在np.load上可以执行但fromfile不能执行的任何操作吗?反之亦然?

2 个答案:

答案 0 :(得分:3)

fromfile == np.load?

不。 numpy.load读取NPY format中的文件。这是一种包含元数据的特定格式,该元数据定义了numpy数组的形状和数据类型。

numpy.fromfile从文件中读取原始字节。没有元数据存储在文件中。您使用A的示例确实起作用了,因为fromfile假定的默认数据类型是float64。这是一个不起作用的示例:

In [25]: A = np.array([10, 20, 30, 40])                                                                                                              

In [26]: A.tofile('binary_file')                                                                                                                     

In [27]: B = np.fromfile('binary_file')                                                                                                              

In [28]: B                                                                                                                                           
Out[28]: array([4.9e-323, 9.9e-323, 1.5e-322, 2.0e-322])

答案 1 :(得分:1)

fromfile是低级函数,是load中的numpy调用:

  • np.load (aka np.lib.npio.load)在第452行调用format.read_array。查看加载源,您会发现它试图猜测加载一堆不同二进制文件类型的正确方法。
  • np.lib.format.read_array在第738行调用fromfile。这是从the npy file format加载的,它是一个小的标头加上原始二进制数据
  • fromfilePyArray_FromFile周围的python包装器,这是一个奇怪的函数,它要么加载原始二进制数据(有用的版本),要么以另一种不同的方式加载文本数据。