numpy:有效地读取大数组

NPE*_*NPE 8 python performance numpy scipy large-files

我有一个二进制文件,其中包含n*m32位浮点的密集矩阵.将它读入Fortran排序的numpy数组的最有效方法是什么?

该文件的大小为数千兆字节.我控制格式,但它必须是紧凑的(即大约4*n*m字节长度),并且必须易于从非Python代码生成.

编辑:该方法必须直接生成Fortran排序矩阵(由于数据的大小,我无法创建C有序矩阵,然后将其转换为单独的Fortran排序副本.)

Sve*_*ach 12

NumPy提供fromfile()读取二进制数据.

a = numpy.fromfile("filename", dtype=numpy.float32)
Run Code Online (Sandbox Code Playgroud)

将创建一个包含您的数据的一维数组.要将其作为二维Fortran排序n x m矩阵进行访问,您可以对其进行整形:

a = a.reshape((n, m), order="FORTRAN")
Run Code Online (Sandbox Code Playgroud)

[编辑:reshape()在这种情况下实际上复制数据(请参阅注释).要做到这一点,不要使用cpoying,请使用

a = a.reshape((m, n)).T
Run Code Online (Sandbox Code Playgroud)

感谢Joe Kingtion指出这一点.]

但说实话,如果你的矩阵有几千兆字节,我会选择像h5pyPyTables这样的HDF5工具.这两个工具都有FAQ条目,将工具与另一个工具进行比较.我通常更喜欢h5py,虽然PyTables似乎更常用(两个项目的范围略有不同).

HDF5文件可以使用数据分析中使用的大多数编程语言编写.链接的维基百科文章中的接口列表不完整,例如还有一个R接口.但实际上我不知道你想用哪种语言写数据......