如何将文本文件读入9x9矩阵?

时间:2014-03-12 05:11:49

标签: python

我对这个问题有困难,所以我会描述我的问题。

我有一个包含81个元素但只有1列的文本文件,即它是一个81x1矩阵文件。

实际元素无关紧要。

该文件包含:

0
0
0
0
-1
.
.
.

如何将其读入9x9矩阵列表?

对于每个第9个元素,我想将下一个元素移动到另一个列,以实现9x9矩阵列表。

到目前为止,我有这个:

rewards = []
zero_list = ["0", "0", "0", "0", "0", "0", "0", "0", "0"]
for index in range(len(zero_list)):
    rewards.append(zero_list)

现在我有一个包含所有0&#39的9x9矩阵。

但我不确定如何将值存储在我的奖励列表中。

谢谢!

3 个答案:

答案 0 :(得分:2)

使用with子句打开文件,列表理解重塑:

with open('a.x') as f:
     vals=list(map(int, f))
     res=[vals[i: i+9] for i in range(0, 81, 9)]
     print res

如果您正在使用numpyreshaping会更容易:

import numpy as np
res=np.array(vals).reshape((9,9))

答案 1 :(得分:1)

你可以试试这个:

import math

zero_list = ["0", "0", "0", "0", "0", "0", "0", "0", "0"]
chunk = int(math.sqrt(len(zero_list)))

for i in xrange(0, len(zero_list), chunk)):
    print zero_list[i:i+chunk]

主要使用numpy创建数组的方法:

from numpy  import array, reshape

zero_list = ["0", "0", "0", "0", "0", "0", "0", "0", "0"]
rewards = array(zero_list)
rewards.reshape(3,3)

答案 2 :(得分:0)

有简单的方法:将其读入单个列表,然后使用this question/answer将其拆分为块。

然后我将在这里描述一种艰难的(ish)方式。此方法的优点是您不需要提前使用整个文件,因此可以节省内存。在你的情况下(81个元素),内存根本不是问题,但对于可能看到这个的其他人来说,这可能是一个问题。这里的关键是使用itertools 1

from itertools import izip_longest, imap


# itertools recipe :)
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

with open(datafilename, 'r') as fin:
    numbers = imap(int, fin)
    data = list(grouper(numbers, 9))

print data

请注意,这会为您提供tuple的列表。如果您想要列表,请更改最后一行:

with open(datafilename, 'r') as fin:
    numbers = imap(int, fin)
    data = [list(x) for x in grouper(numbers, 9)]

1 假设是python2.x。在python3.x中,没有imap,常规map会很好。另外izip_longest - > zip_longest