微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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\',(\'col4\',(\'col5\',(\'col6\',(\'col7\',(\'col8\',(\'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\')]))
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。