在python中将不同大小的行读入列中

时间:2014-09-28 02:31:33

标签: python rows

我有一个看起来像这样的输入文件:

0.1 0.3 0.4 0.3
0.2 02. 1.2 -0.2
0.1 -1.22 0.12 9.2 0.2 0.2
0.3 -1.42 0.2 6.2 0.9 0.88
0.3 -1.42 0.12 1.1 0.1 0.88 0.06 0.14
4

所以它从一些列开始,以n * 2列结束(n是最后一行)。 我可以得到行数,比如#rows = i。我也可以得到n。 我想把这个文件读成python 2d数组(不是列表),例如阵列[I] [N * 2]。我意识到我可能需要用零填充空列,以便它可以简单地读作

Array = numpy.loadtxt("data.txt")

但我不知道该怎么办。

由于

2 个答案:

答案 0 :(得分:2)

我认为任何内置的缺失值都不会对此有所帮助,因为空格分隔的列使得缺少值的模糊不清。 (在你的上下文中没有含糊不清 - 你知道所有缺失的列都在右边 - 但是一个通用的解析器不会。)希望我错了,其他人会提供一个更简单的答案,但是否则......

一种选择是在运行中逐行扩展线条并将它们送入数组。如果记忆不是问题,你可以通过对该行的列表理解来做到这一点:

def readrow(row, cols):
    a = np.fromstring(row, sep=' ')
    a.resize((cols,)
    return a

with open(file_path, 'rb') as f:
    a = np.array([readrow(row, 2*n) for row in f])

如果你不能浪费内存来创建i 1D数组的临时列表,你可能需要使用类似fromiter的东西来生成一维数组,然后重新整形:

a = np.fromiter(itertools.chain.from_iterable(
    readrow(row, n*2) for row in f)).reshape((n*2,))

(虽然此时,使用numpy来解析行而不是csv或只是str.split似乎有点傻。)

答案 1 :(得分:0)

如果你想用0.0'来填充短线,这里是一种方法 - 填充一整套0.0' s,然后只切出主要的重要部分:

data = """0.1 0.3 0.4 0.3
0.2 02. 1.2 -0.2
0.1 -1.22 0.12 9.2 0.2 0.2
0.3 -1.42 0.2 6.2 0.9 0.88
0.3 -1.42 0.12 1.1 0.1 0.88 0.06 0.14
4""".splitlines()

maxcols = int(data[-1])*2

emptyvalue = 0.0
pad = [emptyvalue]*maxcols

for line in data[:-1]:
    # get the input data values, converted from strings to floats
    vals = map(float, line.split())

    # pad the input with default values, then only take the first maxcols values
    vals = (vals + pad)[:maxcols]

    # show our work in a nice table
    print "[" + ','.join("%s%.2f" % (' ' if v>=0 else '', v) for v in vals) + "]"

打印

[ 0.10, 0.30, 0.40, 0.30, 0.00, 0.00, 0.00, 0.00]
[ 0.20, 2.00, 1.20,-0.20, 0.00, 0.00, 0.00, 0.00]
[ 0.10,-1.22, 0.12, 9.20, 0.20, 0.20, 0.00, 0.00]
[ 0.30,-1.42, 0.20, 6.20, 0.90, 0.88, 0.00, 0.00]
[ 0.30,-1.42, 0.12, 1.10, 0.10, 0.88, 0.06, 0.14]