【问题标题】:NumPy: load heterogenous columns of data from list of stringsNumPy:从字符串列表中加载异构数据列
【发布时间】: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')]),对吗?

【问题讨论】:

    标签: python load numpy


    【解决方案1】:

    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')]))
    

    【讨论】:

    • 我得到了一个相关的MemoryError,其中包含几百万行的字符串join。因此,我将我的 readline 文件输入提供给 StringIO 缓冲区以传递给 np.loadtxt (我需要通过 readline 预处理输入以查找相关部分)。所有很棒的提示,谢谢!
    • 注意:np.fromiter 示例无法按预期工作,原因不明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2020-01-08
    • 2019-03-24
    • 2021-03-07
    相关资源
    最近更新 更多