python - NumPy:从字符串列表加载异构数据列

标签 python load numpy

我正在处理存储在 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')]) ,正确吗?

最佳答案

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

关于python - NumPy:从字符串列表加载异构数据列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5657444/

相关文章:

python - 单个语句中的多个比较运算符(链接比较运算符)

python - 如何更快地在文本文件中搜索字符串

hadoop - hive中如何自动加载数据

python - numpy.polyfit vs numpy.polynomial.polynomial.polyfit

python - 从 Amazon S3 迁移到 Azure 存储(Django Web 应用程序)

python ssl eof发生违反协议(protocol),wantwritererror,zeroreturnerror

mysql - 加载数据mysql

jquery - 当使用 JQuery.load 加载页面时,IE7 和 8 会发出混合内容警告

Python 多元简单线性回归

python - 如何转置 3D np 数组中的每个元素