我的一个朋友需要阅读大量令人讨厌的数据(大约18000个数据集)。具体来说,数据应该是8列和~8000行数据,而是数据以7列的形式传递,最后一个条目溢出到下一行的第一列。
另外每30行只有4列。这是因为某些上游程序正在将一个200 x 280阵列重新整形为7x8120阵列。
我的问题是:我们如何将数据读入8x7000阵列。当列数不均匀时,我通常的np.loadtxt和np.genfromtxt库都会失败。
请记住,性能是一个因素,因为必须为~18000个数据文件完成。
以下是典型数据文件的链接: http://users-phys.au.dk/hha07/hk_L1.ref
答案 0 :(得分:11)
我想到的更简单的方法:
with open("hk_L1.ref") as f:
data = numpy.array(f.read().split(), dtype=float).reshape(7000, 8)
首先将数据读取为一维数组,完全忽略所有换行符,然后将其重新整形为所需的形状。
虽然我认为该任务无论如何都会受I / O限制,但如果重要的话,这种方法应该使用很少的处理器时间。
答案 1 :(得分:1)
如果我理解正确(请参阅我的评论),您可以将您的输入拆分为令牌,然后将其以八个为单位进行处理:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
f = open('filename.ref')
tokens = f.read().split()
rows = []
for idx, token in enumerate(tokens):
if idx % 8 == 0:
# this is a new row, use a new list.
row = []
rows.append(row)
row.append(token)
# rows is now a list of lists with the desired data.
这在我的电脑中按原样在0.2秒内运行。
编辑:使用@ SvenMarnach的建议。
答案 2 :(得分:0)
这个怎么样?
data = []
curRow = []
dataPerRow = 8
for row in FILE.readlines():
for item in row.split():
if len(curRow) == dataPerRow:
data.append(curRow)
curRow = []
curRow.Append(item)
data.append(curRow)
(假设FILE是正在读入的文件) 然后你有一个列表列表,可以用于任何目的。