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

在python中将不同大小的行读入列,python,rows,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]。我意识到我可能需要用零

我有一个类似如下的输入文件:

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")
但我不知道如何继续


谢谢

我认为任何内置的缺少值的东西在这里都不会有帮助,因为空格分隔的列使缺少哪些值变得模糊不清。(在您的上下文中没有歧义,您知道所有缺少的列都在右边,但通用解析器不会这样做。)希望我错了,其他人会提供一个更简单的答案,否则

一种选择是动态地一行一行地扩展这些线,并将它们馈送到一个数组中。如果内存不是问题,您可以通过对行的列表理解来实现这一点:

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
的方法来生成1D数组,然后对其进行重塑:

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

(虽然在这一点上,使用numpy来解析行而不是
csv
或者仅仅
str.split
似乎有点傻。)

如果您想用0.0填充短线,这里有一种方法-用全套0.0填充,然后只切片最前面的重要部分:

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]

我以为我明白你想要什么,直到你说
Array[I][n*2]
。这看起来像是一个1D数组,由1D事物组成。二维数组的索引为
A[i,j]
,其形状类似于
(i,n*2)
。这就是你想要的吗?是的,抱歉,我把C++语法和Python语法混淆了,这不仅仅是语法问题。C++根本没有2D阵列;它有数组(当然,它有1D N*M数组,您可以手动跨步)。如果你真的想要一个像C++数组那样的东西,首先你就不会有这个问题,因为数组的数组不一定是矩形,而是二维数组。边注:你应该读PEP 8:实例名称通常是小写的(<代码>数组< /代码>)。我认为这是一个很好的答案。不过,我可以吹毛求疵:
fname
实际上是
fpath
,我不明白为什么需要
rb
模式,因为输入文件显然是一个文本文件。因此,我将执行一个简单的
open(fpath)
。还有最后一行的问题,它显然包含了原始问题中的
n
,不应该放在数组中,但是让我们看看耶稣说了什么。这里的答案都没有真正的帮助。这个答案看起来很有希望,但当我尝试实现它时,它给出了错误“invalid mode('rb')或filename”,这很奇怪,因为我没有包含'rb',我还有一行与open语句/文件相同。我将其归结为:如何将列表的值复制到更大的numpy数组。假设list=[1 2 3 4 5]要复制到所有条目均为零的数组[10]中。如何将列表复制到数组中的前5个元素,其余元素保持为零。Thanks@EOL:
fname
是询问者代码中的任何内容,他没有给我们。
rb
模式是必需的,因为
np.fromstring
是因为在3.x中它需要
字节,而不是
str
;如果切换到
csv
,则在3.x中不再需要它,而是在2.x中。不管怎样,它都不会痛。最后一行包含原始问题中的
n
,因为他说他可以独立地获取
i
n
,所以我假设我不需要编写获取它们的代码。@Jesus:如果没有看到生成错误的代码,我显然无法帮助您调试它。但是关于你的第二个问题:当然,你可以创建一个10个零的数组,然后复制列表,但是为什么你不能把它转换成一个5的数组,然后像我的代码那样调用
resize
?阿巴内特的方法很好。如果要复制到现有的NumPy数组,只需执行类似于
arr[:5]=range(5)
(分配到切片)的操作即可。