【发布时间】:2011-04-14 01:01:55
【问题描述】:
我正在处理存储在 ASCII 文件中的数组数据(类似于 this thread)。我的文件至少有 2M 行 (158 MB),并且被分成具有不同架构的多个部分。在我的读取格式的模块中,我想通过lines = open('myfile.txt', 'r').readlines() 读取整个文件,这样我就可以索引每个部分的位置,然后将我需要的每个部分读入 NumPy 数据结构。
例如,一节的摘录是:
>>> print lines[5:10]
[' 1 0.1000 0.300E-03 0.000E+00 0.300E-03 0.000E+00 0.000E+00 0.300E-03 0.100E-03\n',
' 2 0.1000 0.120E-02 0.000E+00 0.120E-02 0.000E+00 0.000E+00 0.120E-02 0.100E-03\n',
' 3 0.1000 0.100E-02 0.000E+00 0.100E-02 0.000E+00 0.000E+00 0.100E-02 0.100E-03\n',
' 4 0.1000 0.110E-02 0.000E+00 0.110E-02 0.000E+00 0.000E+00 0.110E-02 0.100E-03\n',
' 5 0.1000 0.700E-03 0.000E+00 0.700E-03 0.000E+00 0.000E+00 0.700E-03 0.100E-03\n']
其中有架构[int, float, float, float, float, float, float, float, float],后面的部分会有更简单的[int, float]架构:
>>> print lines[20:25]
[' 1 0.00000E+00\n',
' 2 0.43927E-07\n',
' 3 0.44006E-07\n',
' 4 0.44020E-07\n',
' 5 0.44039E-07\n']
如何使用 NumPy 快速加载行的不同部分?我看到有np.loadtxt,但它需要一个文件句柄,并且一直读到最后。我还看到了np.from* 函数,但我不确定如何将它们与我已经阅读过的lines 一起使用。我需要读两次文件吗?
关于异构数据类型,我想我可以使用复合 dtype,比如 np.dtype([('col1', '<i2'), ('col2', 'f4'), ('col3', 'f4'), ('col4', 'f4'), ('col5', 'f4'), ('col6', 'f4'), ('col7', 'f4'), ('col8', 'f4'), ('col9', 'f4')]),对吗?
【问题讨论】: