我有一个看起来像这样的输入文件:
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")
但我不知道该怎么办。
由于
答案 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]