我对这个问题有困难,所以我会描述我的问题。
我有一个包含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矩阵。
但我不确定如何将值存储在我的奖励列表中。
谢谢!
答案 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
如果您正在使用numpy
,reshaping会更容易:
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
。