NumPy:从字符串列表加载数据的异类列

|| 我正在处理存储在ASCII文件中的数组数据(类似于此线程)。我的文件至少有2M行(158 MB),并分为具有不同模式的多个部分。在读取格式的模块中,我想通过ѭ0读取整个文件,因此我可以索引每个节的位置,然后将需要的每个节读入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\']
具有模式“ 2”,后面的部分将具有更简单的“ 3”模式:
>>> 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\')])
,对吗?     
已邀请:
StringIO
可以从字符串中创建文件类型的对象。所以你可以做
from StringIO import StringIO
m = np.loadtxt(StringIO(\'\\n\'.join(lines[5:10])))
甚至更简单,只需
m = np.fromiter(lines[5:10],np.dtype([(\'col1\', \'<i2\'), (\'col2\', \'f4\'), (\'col3\', \'f4\')]))
    

要回复问题请先登录注册